首页 > 数据库 >Redis集群模式哈希槽rename问题

Redis集群模式哈希槽rename问题

时间:2022-09-02 15:44:39浏览次数:64  
标签:rename key Redis 集群 KEY 哈希 NAME

(error) ERR 'RENAME' command keys must in same slot

一、介绍

我们先来看基本的介绍
Redis Rename 命令用于修改 key 的名称 。

1、语法

redis rename命令的基本用法如下
RENAME OLD_KEY_NAME NEW_KEY_NAME

2、可用版本

= 1.0.0

3、返回值

将前面key的值替换为后面新的值
old_key_name 这个key必须存在,后面new_key_name这个key可以存在,也可以不存在,当存在时会覆盖之前的数据,因为key变了,前面key的数据也不存在了,当不存在时,直接替换旧key的名字
当改名成功会出现OK

当OLD_KEY_NAME 与 NEW_KEY_NAME 相同,或者 OLD_KEY_NAME 不存在时,返回错误,当 NEW_KEY_NAME 已经存在时,RENAME命令将覆盖旧值。

二、问题

一切都没问题,代码也这么写了,因为涉及多个key,所以使用了pipelining批量rename
redisTemplate.execute((RedisConnection connection) -> { Jedis jedis = (Jedis) connection.getNativeConnection(); Pipeline p = jedis.pipelined(); keys.forEach(key -> p.rename(key + TEMP_SUFFIX, key)); return p.sync(); });
然后上了测试,没问题。。
然后上了线上,定时任务执行,发现出了问题,因为使用了p.sync(),没有关心返回结果,也没有报错,也没有错误日志,但是新的key里面就是没有数据,最后一次一次复查代码,雀氏没问题呀,
最后在线上redis进行手动rename命令测试,发现了问题
rename rank1 rank
(error) ERR 'RENAME' command keys must in same slot

三、解决办法

究其原因,是因为测试环境是redis的单机模式,线上使用的是阿里云的Redis集群版,需要rename命令的两个key必须处于相同的插槽,为了使两个缓存key处于同一插槽
可以将两个key的公共部门使用{}括起来,

  • 如果想在集群模式使用rename命令,在设计key的时候,将公共部分用{}括起来,上述命令修改设计后执行为rename {rank}1 {rank}
  • 或者避免这种用法,直接先删后查

四、原因

Redis Cluster在设计时没有使用一致性Hash (Consistency Hashing),而是使用数据分片引入哈希槽(Hash solt)来实现
一个Redis集群,默认有16384个hash槽(0-16383随机分配)向redis集群添加数据的时候,经过Redis的hash运算,
集群使用公式slot=CRC16(key)/16384来计算key属于哪个槽,其中CRC16(key)语句用于计算key的CRC16 校验和。
判断这个key应该存放的槽位是在哪个,在看这个槽位属于哪个节点,然后这个key就添加到这个节点上

标签:rename,key,Redis,集群,KEY,哈希,NAME
From: https://www.cnblogs.com/LiuFqiang/p/16650148.html

相关文章

  • Redis服务端命令请求处理
    命令处理流程1.Redis单线程单进程通过IO复用从文件事件中选出已经就绪的命令放入输入缓存区querybuffer2.一个个取出querybuffer里的命令进行解析,解析argv和argc3.通过a......
  • 机器学习中的数值查找算法(3)——哈希查找算法
    原文链接:机器学习中的数值查找算法(3)——哈希查找算法–每天进步一点点(longkui.site)0.前言前面介绍的查找算法均是基于有序序列的查找方式,哈希查找是通过计算元素......
  • SpringBoot整合Redis
    14、SpringBoot整合Redis14.1、概述SpringBoot操作数据库:spring-data,jpa,jdbc,mongodb,redisSpringData也是和SpringBoot齐名的项目!说明:在SpringBoot2.x之后,原来使用的jed......
  • 28 | JAVA集合Properties专门用来存取配置文件(底层仍为哈希表)
    使用Properties配置文件的特点是,它的Key-Value一般都是String-String类型的,因此我们完全可以用Map<String,String>来表示它由于历史遗留原因,Properties内部本质上是一......
  • 4. 简述redis集群的实现原理
    4. 简述redis集群的实现原理  4.1RedisCluster工作原理 在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以......
  • 5、基于redis5的redis cluster部署
    5、基于redis5的rediscluster部署   5.1原生命令手动部署过程在所有节点安装redis,并配置开启cluster功能各个节点执行meet,实现所有节点的相互通信为各个m......
  • 1、简述redis特点及其应用场景
    1、简述redis特点及其应用场景 1.1redis特点速度快:10WQPS,基于内存,C语言实现单线程持久化支持多种数据结构支持多种编程语言功能丰富:支持Lua脚本,发布订阅......
  • 2. 对比redis的RDB、AOF模式的优缺点
    2. 对比redis的RDB、AOF模式的优缺点 2.1 redis的RDB模式2.1.1RDB模式工作原理  RDB(RedisDataBase):基于时间的快照,其默认只保留当前最新的一次快照,特点......
  • 3.实现redis哨兵,模拟master故障场景
    3.实现redis哨兵,模拟master故障场景实验拓扑图  3.1哨兵的准备实现主从复制架构哨兵的前提是已经实现了一个redis的主从复制的运行环境,从而实现一个一主两从基于......
  • leetcode706-设计哈希映射
    设计哈希映射哈希+链表classMyHashMap{classPair{intkey;intvalue;publicPair(intkey,intvalue){this.key=......