《探错笔记》之Redis的键rehash现象

《探错笔记》之Redis的键rehash现象

什么是键rehash现象

在redis中,键值以哈西表的方式进行存储,在键值对的数目比较多时,哈西值冲突的次数就会变多,这会降低检索效率。为了减少哈西表中的地址冲突次数,redis会增加键值空间,重新定义键值对的映射地址,也就是进行所谓的rehash。

Redis的键rehash现象出现情形

若实例化 JedisShardInfo 时不设置节点名称(name属性),那么当Redis节点列表的顺序发生变化时,会发生“ 键 rehash 现象 ”

ps:本文基于Jedis2.6,非高版本或lettuce等其他框架

解决途径之Sharded的initialize(…)方法实现

JedisShardInfo不设置节点名称(name属性),那么当Redis节点列表的顺序发生变化时,会发生“键 rehash 现象”;

唯一节点名称+编号(推荐)

较好地一致性hash策略 是:唯一节点名称+编号,不要考虑权重因素!

1
long hash = algo.hash(shardInfo.getName() + "*" + n)

所以, 在配置Redis服务列表时,必须要设置节点逻辑名称(name属性) 。

1
redis.server.list=192.168.1.31:6379: Shard-01 ,192.168.1.32:6379: Shard-02 ,192.168.1.33:6379: Shard-03 ,192.168.1.34:6379: Shard-04

节点IP:端口号+编号

Memcached Java Client,就是采用这种策略。

缺点: 因机房迁移等原因,可能导致节点IP发生改变!

this.algo.hash(shardInfo.getName() + “*” + shardInfo.getWeight() + n)

优点 :这样设计避免了上面”因节点顺序调整而引发rehash”的问题,不推荐

缺点 :”节点名称+权重”必须是唯一的,否则节点会出现重叠覆盖! 同时,”节点名称+ 权重”必须不能被中途改变!

this.algo.hash(“SHARD-“ + i + “-NODE-“ + n)

优点 :无,不推荐
缺点 :将节点的顺序索引i作为hash的一部分! 当节点顺序被无意识地调整了,会触发”键 rehash 现象” ,那就杯具啦!(”因节点顺序调整而引发rehash”的问题)


关注Github:1/2极客

关注博客:御前提笔小书童

关注网站:HuMingfeng

关注公众号:开发者的花花世界


本作品采用知识共享署名 4.0 中国大陆许可协议进行许可,欢迎转载,但转载请注明来自御前提笔小书童,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:https://royalscholar.cn/2019/09/29/《探错笔记》之Redis的键rehash现象/

# IDEA

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×