今天被redis的ERR no such key狠狠的教育了
案发现场今天做项目,使用rename的时候报了个错org.springframework.dao.InvalidDataAccessApiUsageException: ERR no such key. channel: [id: 0xf40bda08, L:/172.31.60.56:38338 - R:172.31.8.94/172.31.8.94:6379] command: (RENAME
先描述一下车祸现场:
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落到哪个槽位上
更多推荐
所有评论(0)