先描述一下车祸现场:

org.springframework.dao.InvalidDataAccessApiUsageException: ERR no such key. channel: command: (RENAME), params: [[123, 99, 111, 110, 118, 58, 108, 105, 115, 116, …], [123, 99, 111, 110, 118, 58, 108, 105, 115, 116, …]]; nested exception is org.redisson.client.RedisException: ERR no such key. channel: command: (RENAME), params: [[123, 99, 111, 110, 118, 58, 108, 105, 115, 116, …], [123, 99, 111, 110, 118, 58, 108, 105, 115, 116, …]]

因为我们测试环境是rerdis的集群,一开始考虑到的问题是rename后新的key落到了另一个节点上,所以会出错,后来发现是因为rename的源key不存在,所以抛出的异常,对于redis集群模式,如果想让两个节点命中同一个节点上,可以指定一个相同的前缀,用 {} 进行包装,即可实现落到同一个节点上,可以使用如下的命令获取到对应的key落到那个槽位上(前提redis必须是集群模式)

redis:6379> CLUSTER KEYSLOT “{convo_list}_abc_abc”
(integer) 13975
redis:6379> CLUSTER KEYSLOT “{convo_list}_abc_ab234234c”
(integer) 13975

总结:
1.集群模式下,使用rename报错,可能是落到了另一个节点上,可能源key不存在
2.集群模式下,如果想让两个或者多个key落到同一个节点上,可以用 {} 修饰统一前缀
3.集群模式下,即使你的key不是用 : 分段的,只要带上 {} 依旧会落到同一台机器上
4.集群模式下,可以使用 CLUSTER KEYSLOT key 计算对应的key落到哪个槽位上

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐