redis操作
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
3.4 KiB

  1. package redis
  2. import (
  3. "errors"
  4. redisdb "github.com/gomodule/redigo/redis"
  5. )
  6. /**
  7. * 集合成员数量
  8. */
  9. func ZCard(key interface{}) (int64, error) {
  10. c := GetConn()
  11. reply, err := c.Do("ZCARD", key)
  12. CloseConn(c)
  13. if err != nil {
  14. return 0, err
  15. } else {
  16. return redisdb.Int64(reply, nil)
  17. }
  18. }
  19. /*
  20. * 存值
  21. * key
  22. * member 成员
  23. * score 分值
  24. */
  25. func ZAdd(key string, score, member interface{}) (int64, error) {
  26. c := GetConn()
  27. reply, err := c.Do("ZADD", key, score, member)
  28. CloseConn(c)
  29. if err != nil {
  30. return 0, err
  31. } else {
  32. return redisdb.Int64(reply, nil)
  33. }
  34. }
  35. /*
  36. * 删除hash值
  37. */
  38. func ZRem(key, member interface{}) (int64, error) {
  39. c := GetConn()
  40. reply, err := c.Do("ZREM", key, member)
  41. CloseConn(c)
  42. if err != nil {
  43. return 0, err
  44. } else {
  45. return redisdb.Int64(reply, nil)
  46. }
  47. }
  48. /*
  49. * 区间数量
  50. * key
  51. * min/max 最小/最大值
  52. */
  53. func ZCount(key string, min, max interface{}) (int64, error) {
  54. c := GetConn()
  55. reply, err := c.Do("ZCOUNT", key, min, max)
  56. CloseConn(c)
  57. if err != nil {
  58. return 0, err
  59. } else {
  60. return redisdb.Int64(reply, nil)
  61. }
  62. }
  63. /*
  64. * 自增
  65. * key
  66. * member 成员
  67. * inc 分值
  68. */
  69. func ZIncrBy(key string, inc, member interface{}) (int64, error) {
  70. c := GetConn()
  71. reply, err := c.Do("ZINCRBY", key, inc, member)
  72. CloseConn(c)
  73. if err != nil {
  74. return 0, err
  75. } else {
  76. return redisdb.Int64(reply, nil)
  77. }
  78. }
  79. func ZRange(key string, start, stop int64) ([]map[string]string, error) {
  80. c := GetConn()
  81. defer CloseConn(c)
  82. values, err := redisdb.Values(c.Do("ZRANGE", key, start, stop, "WITHSCORES"))
  83. if err != nil {
  84. return nil, err
  85. }
  86. if len(values)%2 != 0 {
  87. return nil, errors.New("redigo: ZRange expects even number of values result")
  88. }
  89. var l []map[string]string
  90. for i := 0; i < len(values); i += 2 {
  91. key, okKey := values[i].([]byte)
  92. value, okValue := values[i+1].([]byte)
  93. if !okKey || !okValue {
  94. return nil, errors.New("redigo: ZRange key not a bulk string value")
  95. }
  96. l = append(l, map[string]string{
  97. "member": string(key),
  98. "score": string(value),
  99. })
  100. }
  101. return l, nil
  102. }
  103. func ZScan(key, field string, len int64) ([]string, error) {
  104. c := GetConn()
  105. defer CloseConn(c)
  106. zscanResult, err := redisdb.Values(c.Do("ZSCAN", key, "0", "MATCH", field, "COUNT", len))
  107. if err != nil {
  108. return nil, err
  109. }
  110. var cursor int
  111. var membersAndScores []string
  112. var member []string
  113. redisdb.Scan(zscanResult, &cursor, &membersAndScores)
  114. for i, v := range membersAndScores {
  115. if i%2 == 0 {
  116. member = append(member, v)
  117. }
  118. }
  119. return member, nil
  120. }
  121. /*
  122. * 回有序集合中指定成员的索引(从小到大排名)
  123. * key
  124. * member 成员
  125. */
  126. func ZRank(key string, member interface{}) (int64, error) {
  127. c := GetConn()
  128. reply, err := c.Do("ZRANK", key, member)
  129. CloseConn(c)
  130. if err != nil {
  131. return 0, err
  132. } else {
  133. return redisdb.Int64(reply, nil)
  134. }
  135. }
  136. /*
  137. * 有序集合中指定成员的索引(从大到小排名)
  138. * key
  139. * member 成员
  140. */
  141. func ZRevrank(key string, member interface{}) (int64, error) {
  142. c := GetConn()
  143. reply, err := c.Do("ZREVRANK", key, member)
  144. CloseConn(c)
  145. if err != nil {
  146. return 0, err
  147. } else {
  148. return redisdb.Int64(reply, nil)
  149. }
  150. }
  151. /*
  152. * 指定成员的分数
  153. * key
  154. * member 成员
  155. */
  156. func ZScore(key string, member interface{}) (float64, error) {
  157. c := GetConn()
  158. reply, err := c.Do("ZSCORE", key, member)
  159. CloseConn(c)
  160. if err != nil {
  161. return 0, err
  162. } else {
  163. return redisdb.Float64(reply, nil)
  164. }
  165. }