用途:指导在分片 Redis Cluster 及独立主从复制环境中设计键名与路由读请求,主要针对两类常见问题——多键操作的 CROSSSLOT 错误,以及主节点读流量过载。
适用时机:为 Redis Cluster 设计键;排查 MGET、SDIFF、事务、管道中的 CROSSSLOT 报错;实现涉及多键的事务或 Lua 脚本;在不增加分片的情况下扩展读流量。
一、多键操作的哈希标签:Redis Cluster 按键名哈希将键分布到 16384 个槽。任何多键命令(MGET、SDIFF、SUNIONSTORE、事务、管道、带多个 KEYS[] 的 Lua 脚本)要求所有键在同一槽,否则返回 CROSSSLOT。哈希标签可强制同槽:只有 { 与 } 之间的内容参与槽分配,因此共享同一标签的键总落在同一节点。示例:redis.set("{user:1001}:profile", "...") 与 redis.set("{user:1001}:settings", "...") 可安全做多键操作;而不带标签的 user:1001:profile、user:1001:settings 在集群模式的多键命令/管道下会报 CROSSSLOT。
经验规则:标签应限定在有意义的实体上,如 {user:1001};避免裸用 {1001},否则 purchase:{1001}、employee:{1001} 等无关命名空间会挤在同一槽。只在实际需要多键操作处打标签,全部打标签会造成热点并削弱分片意义。单键命令对带标签的键照常工作,标签可后续逐步加,但生产环境重命名键代价高,应提前规划。
二、读副本扩展读密集负载:读多写少时把读路由到副本,释放主节点容量,集群(每个分片至少一个副本)与独立主从复制均适用。集群示例:from redis.cluster import RedisCluster; rc = RedisCluster(host="localhost", port=6379, read_from_replicas=True),写走主,读可能由副本提供。非集群可分别指向主、副本两个客户端。代价是最终一致性:不要从副本读自己刚写的数据,涉及严格新鲜度的场景(如财务余额、幂等状态)不要用副本读;适合缓存层、分析、仪表盘、推荐流。
限制与说明:以上涵盖键设计与读路由,未提供具体版本要求、客户端兼容性列表或完整配置参数,这些暂未提供。