package rank
import (
"fmt"
"webgame/models"
"github.com/go-redis/redis"
)
var rds = models.RedisClient()
const rankId = "1"
var zsetKey = models.GenerateKey(models.REDIS_SET_USER_RANK, rankId)
// 获取排行榜列表
func GetRankList(rankId string) ([]redis.Z, error) {
return redisExample2()
}
func addRank(members redis.Z) {
// ZADD
num, err := rds.ZAdd(zsetKey, members).Result()
if err != nil {
fmt.Printf("zadd failed, err:%v\n", err)
return
}
fmt.Printf("zadd %d succ.\n", num)
}
func redisExample2() ([]redis.Z, error) {
addRank(redis.Z{Score: 90, Member: "Golang"})
addRank(redis.Z{Score: 98, Member: "Java"})
addRank(redis.Z{Score: 95, Member: "Python"})
addRank(redis.Z{Score: 97, Member: "JavaScript"})
addRank(redis.Z{Score: 99, Member: "C/C++"})
// 把Golang的分数加10
newScore, err := rds.ZIncrBy(zsetKey, 10.0, "Golang").Result()
if err != nil {
fmt.Printf("zincrby failed, err:%v\n", err)
return nil, fmt.Errorf("GetRankList error : %v", err)
}
fmt.Printf("Golang's score is %f now.\n", newScore)
// 取分数最高的3个
ret, err := rds.ZRevRangeWithScores(zsetKey, 0, 2).Result()
if err != nil {
fmt.Printf("zrevrange failed, err:%v\n", err)
return nil, fmt.Errorf("GetRankList error : %v", err)
}
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
// 取95~100分的
ret, err = rds.ZRangeByScoreWithScores(zsetKey, redis.ZRangeBy{Min: "95", Max: "100"}).Result()
if err != nil {
fmt.Printf("zrangebyscore failed, err:%v\n", err)
return nil, fmt.Errorf("GetRankList error : %v", err)
}
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
return ret, err
}
测试代码
rank.GetRankList("1")
参考资料
go并发之美·redis篇·实现实时排行榜
https://lan6193.blog.csdn.net/article/details/108931188
Go语言操作Redis
https://www.cnblogs.com/aaronthon/p/11116160.html
golang redis 有序集合(sorted set)
https://www.tizi365.com/archives/304.html