redis集群模式
文档
- redis单机安装
- redis常用的五种数据类型
- redis数据类型-位图bitmap
- redis数据类型-基数统计HyperLogLog
- redis数据类型-地理空间GEO
- redis数据类型-流Stream
- redis数据类型-位域bitfield
- redis持久化-RDB
- redis持久化-AOF
- redis持久化-RDB+AOF混合模式
- redis持久化-纯缓存模式
- redis事务
- redis管道 -redis pipeline -redis pipelining
- redis发布订阅
- redis主从复制
- redis哨兵模式
- redis集群模式 -分区算法
- redis集群模式 -集群搭建
- redis集群模式 -节点故障 -节点主从调整
- redis集群模式 -扩缩容
官方文档
说明
- redis版本:7.0.0
redis集群模式-批量操作
集群模式下键值对批量操作可能会出现异常
-
在集群模式下,使用
mset
、mget
等命令时,可能会出现异常,如下面示例,出现异常的原因就是这些批量操作的key并没有在同一个slot下,redis不支持跨越槽位操作 -
示例:
shell127.0.0.1:6379> mset k1 aa k2 bb k3 cc (error) CROSSSLOT Keys in request don't hash to the same slot
集群模式下key命中slot的规则
- 实际上,并不是所有情况下都是对整个key做哈希,然后命中槽位,有些情况下,会对key的部分内容做哈希,然后命中槽位。根据源码
cluster.c
,大概逻辑如下:- 如果
key
不包含{
,对整个key做hash - 如果
key
包含{
,不包含}
,或者{
、}
之间没有任何内容,对整个key做hash - 上面两种情况都没命中,说明包含
{
、}
,并且{
、}
之间有内容,则对{
、}
之间的内容做hash
- 如果
- 通过上面的规则,可以发现,如果key中包含
{
、}
,{
、}
之间有内容,并且{
、}
之间的内容相同,则这些key会命中相同的槽位
集群模式下键值对批量操作的处理方法
-
通常情况下,使用
mset
、mget
等命令时,可能会出现异常,异常的原因就是这些批量操作的key并没有在同一个slot下,所以解决的办法也是,如何能准确的操作一组能命中同一个槽位的key -
根据上面的规则,我们可以使用一组包含
{
、}
,{
、}
之间有内容,并且{
、}
之间的内容相同的key,例如k1{group1}
、k2{group1}
、k3{group1}
shell127.0.0.1:6379> mset k1{group1} aa k2{group1} bb k3{group1} cc -> Redirected to slot [7859] located at 192.168.145.133:6380 OK
-
需要注意的是,
k1{group1}
、k2{group1}
、k3{group1}
这些就是真实的key,获取value时也需要用完整的keyshell127.0.0.1:6379> get k1{group1} -> Redirected to slot [7859] located at 192.168.145.133:6380 "aa"