137 lines
3.6 KiB
Go
137 lines
3.6 KiB
Go
package redis
|
|
|
|
import (
|
|
"github.com/go-redis/redis"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type Z = redis.Z
|
|
|
|
type ZSet struct {
|
|
key string
|
|
client *redis.Client
|
|
}
|
|
|
|
func NewZSet(client *redis.Client, key string) *ZSet {
|
|
return &ZSet{
|
|
key: key,
|
|
client: client,
|
|
}
|
|
}
|
|
|
|
func (s *ZSet) Key() string {
|
|
return s.key
|
|
}
|
|
|
|
// Expire 设置集合过期时间
|
|
func (s *ZSet) Expire(expiration time.Duration) (bool, error) {
|
|
return s.client.Expire(s.key, expiration).Result()
|
|
}
|
|
|
|
// Add 添加一个或多个成员到有序集合
|
|
func (s *ZSet) Add(members ...Z) (int64, error) {
|
|
return s.client.ZAdd(s.key, members...).Result()
|
|
}
|
|
|
|
// Count 返回有序集合在指定分数范围内的成员数量
|
|
func (s *ZSet) Count(min, max float64) (int64, error) {
|
|
return s.client.ZCount(s.key, strconv.FormatFloat(min, 'f', -1, 64), strconv.FormatFloat(max, 'f', -1, 64)).Result()
|
|
}
|
|
|
|
// Score 获取成员的分数
|
|
func (s *ZSet) Score(member string) (float64, error) {
|
|
return s.client.ZScore(s.key, member).Result()
|
|
}
|
|
|
|
// Rank 获取成员的排名(从小到大,0开始)
|
|
func (s *ZSet) Rank(member string) (int64, error) {
|
|
return s.client.ZRank(s.key, member).Result()
|
|
}
|
|
|
|
// RevRank 获取成员的排名(从大到小,0开始)
|
|
func (s *ZSet) RevRank(member string) (int64, error) {
|
|
return s.client.ZRevRank(s.key, member).Result()
|
|
}
|
|
|
|
// Range 返回指定排名范围的成员
|
|
func (s *ZSet) Range(start, stop int64) ([]string, error) {
|
|
return s.client.ZRange(s.key, start, stop).Result()
|
|
}
|
|
|
|
// RangeWithScores 返回指定排名范围的成员和分数
|
|
func (s *ZSet) RangeWithScores(start, stop int64) ([]Z, error) {
|
|
return s.client.ZRangeWithScores(s.key, start, stop).Result()
|
|
}
|
|
|
|
// RangeByScore 返回指定分数范围的成员
|
|
func (s *ZSet) RangeByScore(min, max float64) ([]string, error) {
|
|
opt := redis.ZRangeBy{
|
|
Min: strconv.FormatFloat(min, 'f', -1, 64),
|
|
Max: strconv.FormatFloat(max, 'f', -1, 64),
|
|
}
|
|
return s.client.ZRangeByScore(s.key, opt).Result()
|
|
}
|
|
|
|
// RangeByScoreWithScores 返回指定分数范围的成员和分数
|
|
func (s *ZSet) RangeByScoreWithScores(min, max float64) ([]Z, error) {
|
|
opt := redis.ZRangeBy{
|
|
Min: strconv.FormatFloat(min, 'f', -1, 64),
|
|
Max: strconv.FormatFloat(max, 'f', -1, 64),
|
|
}
|
|
return s.client.ZRangeByScoreWithScores(s.key, opt).Result()
|
|
}
|
|
|
|
// Remove 删除一个或多个成员
|
|
func (s *ZSet) Remove(members ...string) (int64, error) {
|
|
return s.client.ZRem(s.key, members).Result()
|
|
}
|
|
|
|
// RemoveRangeByRank 删除指定排名范围的成员
|
|
func (s *ZSet) RemoveRangeByRank(start, stop int64) (int64, error) {
|
|
return s.client.ZRemRangeByRank(s.key, start, stop).Result()
|
|
}
|
|
|
|
// RemoveRangeByScore 删除指定分数范围的成员
|
|
func (s *ZSet) RemoveRangeByScore(min, max float64) (int64, error) {
|
|
return s.client.ZRemRangeByScore(s.key, strconv.FormatFloat(min, 'f', -1, 64), strconv.FormatFloat(max, 'f', -1, 64)).Result()
|
|
}
|
|
|
|
// Len 返回有序集合的成员数
|
|
func (s *ZSet) Len() (int64, error) {
|
|
return s.client.ZCard(s.key).Result()
|
|
}
|
|
|
|
// IncScore 为成员的分数加上增量
|
|
func (s *ZSet) IncScore(member string, increment float64) (float64, error) {
|
|
return s.client.ZIncrBy(s.key, increment, member).Result()
|
|
}
|
|
|
|
// Scan 扫描有序集合
|
|
func (s *ZSet) Scan(match string, count int64, callback func(member string, score float64) error) error {
|
|
cursor := uint64(0)
|
|
for {
|
|
keys, newCursor, err := s.client.ZScan(s.key, cursor, match, count).Result()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for i := 0; i < len(keys); i += 2 {
|
|
score, err := strconv.ParseFloat(keys[i+1], 64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = callback(keys[i], score)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if newCursor == 0 {
|
|
break
|
|
}
|
|
cursor = newCursor
|
|
}
|
|
return nil
|
|
}
|