RedisCommandExecutionException: MOVED 9656 192.168.1.101:7002

RedisCommandExecutionException: MOVED 9656 192.168.1.101:7002

最近一个同事,在使用Redis集群进行操作的过程中,遇到如下错误
RedisCommandExecutionException: MOVED 9656 192.168.1.101:7002_第1张图片
看这个错误信息,感觉挺奇怪。操作代码,使用Spring封装的RedisTemplate,而且操作内容并不复杂。将相关操作通过redis命令,在客服端执行
RedisCommandExecutionException: MOVED 9656 192.168.1.101:7002_第2张图片
其实,看到这里,想必各位,已经知道异常出现的原因了。由于name和age两个key的槽位不同,在存储时,这两个key被映射到不同的节点,从而出现了上述异常。
下面介绍下Redis槽位信息

Redis集群内置16384个哈希槽,数据存储时,Redis首先对key使用crc16算法进行计算,将计算结果对16384取模,从而确定当前key对应于那个哈希槽。Redis正式通过哈希槽,来将数据大致均匀的映射到不同的节点。

在Redis中,可以通过cluster keyslot命令,查看key对应的槽位。
RedisCommandExecutionException: MOVED 9656 192.168.1.101:7002_第3张图片
好了,到现在为止,知道了这个异常在Redis层面出现的原因。那么,这个原因出现的具体原因是什么呢?首先,让我们看一下其Redis配置
在这里插入图片描述
正式由于在这里使用单节点的配置方式,才导致上述异常信息。基于Redis集群,应当通过

spring.redis.cluster.nodes=192.168.1.101:7001,192.168.1.101:7002,192.168.1.101:7003

结论
1、Redis通过哈希槽,确保数据能够大致均匀的保存到各个节点。而哈希槽的确定,是对key进行crc16运算,然后进行16384求模得到。
2、redis配置时,若使用的是集群,需要使用spring.redis.cluster.nodes方式,进行配置。

你可能感兴趣的:(异常信息,redis,java)