Redis Sorted Set(有序集合) · 7. 集群与扩展至8. Go 客户端与最佳实践
本文按 Redis 8.2.10 核对编码与配置默认值;命令的引入版本另行标注。生产配置可能不同,可通过 CONFIG GET 查询。示例面向独立实验服务,运行结果和内存数字未在本次实测。
7. 集群与扩展
一个全局榜单键始终属于一个槽,集群不会按成员自动分片。按赛季、区域或业务组分榜可以分散访问,但同一时刻的超热赛季榜仍可能是单键热点;进一步分桶时全局排名需应用层合并。副本延迟会影响实时名次,不能拿旧排名直接决定关键奖励。
一个键只在一个分片中,hash tag 控制相关键进入同一槽,不会把一个大键切开。副本读取通常是最终一致观察;操作后立即读到本次写入的需求应选主节点或明确的协调策略。
8. Go 客户端与最佳实践
下面函数使用 github.com/redis/go-redis/v9,调用方提供 context.Context 和已配置认证、超时的 *redis.Client。
go
func SortedSetExample(ctx context.Context, rdb *redis.Client, uid string, score float64) ([]redis.Z, error) {
if err := rdb.ZAdd(ctx, "learn:go:rank", redis.Z{Score: score, Member: uid}).Err(); err != nil {
return nil, err
}
return rdb.ZRevRangeWithScores(ctx, "learn:go:rank", 0, 9).Result()
}go-redis 用 redis.Z{Score, Member} 表示条目,Score 是 float64。所有绝对值不超过 2^53 的整数可被精确表示,超出后不是每个整数都精确;业务常用 2^53−1 作为安全上界。组合积分与时间时校验完整结果且不要先发生整数溢出。示例的写入与读取分开,读取可能包含并发更新。
普通 Pipeline 只是批量发送,不能充当事务;批次过大也会增加响应缓冲与延迟。对超时后的写入重试,需要根据幂等性判断,不能把“没收到响应”当成“没执行”。
继续阅读
继续阅读
- 数据与原子性
- 数据与原子性
- 完整实践