之前我给大家介绍了《使用使用redis-cli批量执行命令》 https://blog.itpub.net/12798004/viewspace-3054147/
当时是redis-cli连接的是单机版的redis,但是在很多企业中目前使用的都是集群模式。Redis Cluster,采用了去中心化的多主多从架构,以提高数据的可用性和伸缩性。这一架构使得Redis Cluster能够在保持高性能的同时,支持更大规模的数据存储和管理。

Redis Cluster 使用哈希槽(hash slot)机制来分配数据。假设我们有三个主节点:A、B、C,它们可以部署在同一台机器的不同端口上,或分布在三台不同的服务器上。在这种设置下,16384个哈希槽将被如下分配:
节点A负责管理0至5460号槽;
节点B负责管理5461至10922号槽;
节点C负责管理10923至16383号槽。
1.数据的保存和获取
存入数据:例如,存储一个键值对,键名为“key”,其哈希值按照 CRC16(‘key’) % 16384 = 6782 计算。根据这个哈希槽号,数据将被存储在节点B上。
获取数据:无论连接哪个节点(A、B、C),获取键名为“key”的数据时,都会根据同样的哈希算法路由到节点B上提取数据。
2.新增或删除主节点
新增节点:假设新增一个节点D,Redis Cluster 会将部分哈希槽从其他节点迁移至D节点。这可能导致哈希槽分布如下调整:
节点A:1365-5460
节点B:6827-10922
节点C:12288-16383
节点D:0-1364,5461-6826,10923-12287
删除节点:删除节点时,其管理的哈希槽会被迁移到其他节点上。迁移完成后,该节点即可被安全移除。
案例演示:
1.以单机模式连接集群时:
redis-cli -h 20.12.47.43 -p 6379 -a 'password'方式连接redis,如果连接的是单机模式,在执行命令时是没有问题的。
但是连接集群模式,执行命令时 redis-cli连接到redis的节点会检查自己在clusterState.slots数组中的项i,判断键所在的槽是否由自己负责。
如果我们使用单机模式的redis-cli客户端,MOVED错误会直接打印出来,因为单机模式的客户端不知道MOVED错误的作用,不会进行转向。可能会报错,原因是在计算槽位时,可能是在别的master下管理的槽位:
[test@test ~]$ redis-cli -h 11.11.47.44 -p 6379 -a 'password'
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
11.11.47.44:6379> set test1 123456
(error) MOVED 4768 11.11.47.45:6379
11.11.47.44:6379>
当我们在 11.11.47.44上执行set test1命令时,提示我们已经连接到 11.11.47.45 :6379去执行。也就说明 计算槽位在 11.11.47.45管理的。所以需要以集群模式的方式连接。
2.以集群模式连接集群时:
以集群模式连接时,只需要添加一个-c的参数。
集群模式下的redis-cli客户端在接收到MOVED错误的时候,不会打印出MOVED错误,而是直接根据MOVED错误的信息自动转向,并打印出转向信息。
[itadmin@dlidcatsapp3 ~]$ /ats/redis/bin/redis-cli -c -h 11.11.47.44 -p 6379 -a 'passwrd'
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
11.11.47.44:6379> set test1 123456
-> Redirected to slot [4768] located at 11.11.47.45:6379
OK
11.11.47.45:6379>
3.执行批量命令如下:
3.1 准备执行的命令
vi redis.txt
set startDisableDate1 20241225010000
set endDisableDate1 20241225230000
set startDisableDate2 20241225010000
set endDisableDate2 20241225230000
set startDisableDate3 20241225010000
set endDisableDate3 20241225230000
3.2执行命令
cat /tmp/redis.txt | redis-cli -c -h 11.11.47.44 -p 6379 -a 'password'