redis.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package dao
  2. import (
  3. "context"
  4. "fmt"
  5. "go-common/library/cache/redis"
  6. "go-common/library/log"
  7. )
  8. const (
  9. _loginShard = 10000
  10. _loginedPrefix = "logined_%d_%d"
  11. )
  12. func loginKey(mid, day int64) string {
  13. return fmt.Sprintf(_loginedPrefix, day, mid/_loginShard)
  14. }
  15. // SetLogin set user logined,
  16. func (d *Dao) SetLogin(c context.Context, mid, day int64) (err error) {
  17. conn := d.redis.Get(c)
  18. defer conn.Close()
  19. if err = conn.Send("SETBIT", loginKey(mid, day), mid%_loginShard, 1); err != nil {
  20. PromError("redis:SetLogin")
  21. log.Error("d.SetLogin(%v,%v) redis: err: %v", mid, day, err)
  22. return
  23. }
  24. if err = conn.Send("EXPIRE", loginKey(mid, day), d.loginExpire); err != nil {
  25. PromError("redis:SetLogin")
  26. log.Error("d.SetLogin(%v,%v) redis: err: %v", mid, day, err)
  27. return
  28. }
  29. if err = conn.Flush(); err != nil {
  30. log.Error("d.SetLogin(%v,%v) redis: err: %v", mid, day, err)
  31. PromError("redis:SetLogin")
  32. return
  33. }
  34. if _, err = redis.Bool(conn.Receive()); err != nil {
  35. log.Error("d.SetLogin(%v,%v) redis: err: %v", mid, day, err)
  36. PromError("redis:SetLogin")
  37. return
  38. }
  39. if _, err = conn.Receive(); err != nil {
  40. log.Error("d.SetLogin(%v,%v) redis: err: %v", mid, day, err)
  41. PromError("redis:SetLogin")
  42. }
  43. return
  44. }
  45. // Logined check if user logined.
  46. func (d *Dao) Logined(c context.Context, mid, day int64) (b bool, err error) {
  47. conn := d.redis.Get(c)
  48. defer conn.Close()
  49. if b, err = redis.Bool(conn.Do("GETBIT", loginKey(mid, day), mid%_loginShard)); err == redis.ErrNil {
  50. err = nil
  51. }
  52. if err != nil {
  53. log.Error("d.Logined(%v,%v) redis err: %+v", mid, day, err)
  54. }
  55. return
  56. }