一种基于哨兵的缓存访问策略

一种基于哨兵的缓存访问策略

学习自 一种基于“哨兵”的分布式缓存设计

通常的缓存访问如下,箭头表示访问量,且为同一时刻访问。

cache access

如果Redis缓存命中,那么web就不会访问数据库,否则,客户端有N个并发请求就会有N个对数据库的并发请求,伴随而来的可能会是N个Redis SET操作。

为了消除这种情况下多余的请求,减轻数据库压力,引入一个“哨兵”请求,即当缓存不命中时,只有一个请求能落到数据库上,其余请求等待缓存更新。

cache access

为了在并发请求中选出一个“哨兵”,对于一个缓存需要有一个计数器与其对应。以下是借助Redis实现的算法流程:

cache access

有一个需要注意的问题就是,上图中红框部分执行失败:例如MySQL无法访问了,那么count将会不断递增,即使MySQL恢复正常了也如此,因为没有请求的count会再次为1。解决办法:

  • 手动设置count为0;
  • 给count设置上限,当达到上限时设置count为0;
  • 将“=1”的条件判断改为类似“count%10=1”;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值