redis.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package dao
  2. import (
  3. "context"
  4. "fmt"
  5. "go-common/library/log"
  6. )
  7. // RedisDecr 指定 key 减去 num
  8. func (d *Dao) RedisDecr(c context.Context, key string, num int) (err error) {
  9. conn := d.redis.Get(c)
  10. defer conn.Close()
  11. if num == 1 {
  12. _, err = conn.Do("DECR", key)
  13. } else {
  14. _, err = conn.Do("DERCBY", key, num)
  15. }
  16. if err != nil {
  17. log.Error("d.RedisDecr(%s, %d) error(%v)", key, num, err)
  18. }
  19. return
  20. }
  21. // RedisDecrExist 当 key 存在时 给 key 减去指定数值 key 不存在时不做操作
  22. func (d *Dao) RedisDecrExist(c context.Context, key string, num int64) (err error) {
  23. conn := d.redis.Get(c)
  24. defer conn.Close()
  25. lua := `if redis.call("EXISTS",KEYS[1])==1 then return redis.call("%s",KEYS[1]%s);else return nil;end`
  26. if num == 1 {
  27. log.Info(fmt.Sprintf(fmt.Sprintf(lua, "DECR", "")+"%d %s", 1, key))
  28. _, err = conn.Do("EVAL", fmt.Sprintf(lua, "DECR", ""), 1, key)
  29. } else {
  30. log.Info(fmt.Sprintf(fmt.Sprintf(lua, "DECRBY", ",ARGV[1]")+"%d %s %d"), 1, key, num)
  31. _, err = conn.Do("EVAL", fmt.Sprintf(lua, "DECRBY", ",ARGV[1]"), 1, key, num)
  32. }
  33. if err != nil {
  34. log.Error("d.RedisDecrExist(%s, %d) error(%v)", key, num, err)
  35. }
  36. return
  37. }
  38. // RedisDel del keys
  39. func (d *Dao) RedisDel(c context.Context, key ...interface{}) (err error) {
  40. if len(key) == 0 {
  41. return
  42. }
  43. conn := d.redis.Get(c)
  44. defer conn.Close()
  45. if _, err = conn.Do("DEL", key...); err != nil {
  46. log.Error("d.RedisDel(%v) error(%v)", key, err)
  47. }
  48. return
  49. }
  50. // RedisSetnx setnx
  51. func (d *Dao) RedisSetnx(c context.Context, key string, val interface{}, ttl int64) (err error) {
  52. conn := d.redis.Get(c)
  53. defer conn.Close()
  54. if ttl > 0 {
  55. lua := `if redis.call("SETNX",KEYS[1],ARGV[1])==1 then return redis.call("EXPIRE",KEYS[1],ARGV[2]);else return 0;end'`
  56. _, err = conn.Do("EVAL", lua, 1, key, val, ttl)
  57. } else {
  58. _, err = conn.Do("SETNX", key, val)
  59. }
  60. if err != nil {
  61. log.Error("d.RedisSetnx(%s, %v, %d) error(%v)", key, val, ttl, err)
  62. }
  63. return
  64. }