package rankings import ( "context" "fmt" "github.com/redis/go-redis/v9" ) // Ranking 排行榜结构体 type Ranking struct { c *redis.Client } const EcpmRankingsListPrefix = "ecpm:rankings:" // NewRanking 创建一个新的排行榜实例 func NewRanking(c *redis.Client) *Ranking { return &Ranking{ c: c, } } func GetRankingsCacheKey(appId uint32, t uint32) string { return fmt.Sprintf("%sappId:%d:type:%d", EcpmRankingsListPrefix, appId, t) } // SetList 向排行榜中添加成员及其分数 func (r *Ranking) SetList(ctx context.Context, key string, data ...redis.Z) { r.c.ZAdd(ctx, key, data...) } // GetList 获取排行榜,按照分数从高到低排序 func (r *Ranking) GetList(ctx context.Context, key string, start, stop int64) (data []redis.Z, err error) { return r.c.ZRevRangeWithScores(ctx, key, start, stop).Result() } // GetRank 获取指定成员在排行榜中的排名(排名从 0 开始,分数越高排名越靠前) func (r *Ranking) GetRank(ctx context.Context, key, member string) (rank int64, err error) { return r.c.ZRevRank(ctx, key, member).Result() } // GetScore 获取指定成员在排行榜中的分数 func (r *Ranking) GetScore(ctx context.Context, key, member string) (score float64, err error) { return r.c.ZScore(ctx, key, member).Result() }