Redis-Hash一致性算法

背景

举例说明:

Redis实例:cs1,cs2,cs3

需存储的数据:10000条商品数据

数据与Redis实例的映射方法: hash(商品数据Key) % (Redis实例的个数)

这样,我们就可以将10000条数据利用hash并取模的形式存储到对应的Redis实例中。

这样会出现一个问题,Redis实例的个数可能是变化的,当增加或减少实例时,映射就会改变,若数据量大,将会出现大批量redis请求找不到的情况,会造成缓存击穿甚至缓存雪崩。Hash一致性算法能在一定程度上解决这个问题。

Hash一致性算法介绍

一致性哈希算法通过一个叫作一致性哈希环的数据结构实现。这个环的起点是 0,终点是 2^32 - 1,并且起点与终点连接,故这个环的整数分布范围是 [0, 2^32-1],如下图所示:

我们先将Redis的三个实例,cs1,cs2,cs3hash取模之后得到对应的值t1,t2,t3,如下图所示。然后将四条商品信息hash取模之后得到对应的值k1,k2,k3,k4,如图所示。按顺时针方向为商品信息找对应的Redis实例,遇到的第一个示例就是商品信息所需存储的位置,如k1,k3->t1、k4->t3、k2->t2。

若新增一个Redis实例cs4,hsh取模后得到t4,如图所示,则有一部分商品信息将会变化所存储的Redis实例,如k3->t1将会变成k3->t4。虽然会有一部分缓存将失效,但大部分缓存仍旧有效。

 一致性hash问题及解决方法

偏斜情况

上图中的Redis实例经过一致性hash算法后得到的值较均匀地分布在hash环上,实际可能并不会出现那么理想的情况,可能会出现Redis实例相邻分布,这样就增加了缓存未击中的几率。

解决办法

针对这个问题,我们可以通过引入虚拟节点来解决负载不均衡的问题。即将每台物理实例虚拟为一组虚拟实例,将虚拟实例放置到哈希环上,如果要确定对象的实例,需先确定对象的虚拟实例,再由虚拟实例确定物理实例。这样就减小了缓存未击中的几率。

缓存读写请求->虚拟实例 ->真实实例->读写

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Redis一致性哈希是一种分布式算法,用于解决在缓存系统中增加或减少实例时可能出现的缓存击穿和缓存雪崩问题。这种算法使用哈希函数将整个哈希值空间组织成一个虚拟的圆环,将不同的缓存数据映射到圆环上的不同位置。具体而言,Redis实例的个数可能会发生变化,当增加或减少实例时,映射关系就会改变,导致大量的Redis请求找不到对应的实例。而一致性哈希算法通过对232取模的方式,将哈希值映射到圆环上的位置,从而实现了负载均衡和缓存数据的一致性存储。相比传统的取模操作,一致性哈希算法能够更好地应对增减Redis实例的情况,提高缓存命中率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis-Hash一致性算法](https://blog.csdn.net/WangLi1201/article/details/79270073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Redis一致性Hash算法](https://blog.csdn.net/qq_21125183/article/details/90019034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Redis 一致性哈希](https://blog.csdn.net/m0_54921756/article/details/125987939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值