首页 > 代码库 > 缓存策略优化
缓存策略优化
作者:zhanhailiang 日期:2014-12-12
需求背景
通常,缓存逻辑是设置一个过期时间,若缓存失效时,就请求后端读取数据并更新缓存。 但是该方案在高qps的场景下会出现问题——在[缓存失效,请求后端读取数并更新缓存)时间段内,所有的请求都会全部透传到后端,该场景对后端将会产生大量请求。所以我们的目标是希望减少这部分请求数。
实现方案
基于概率的实现机制
- 将cache存储两倍的过期时间 2 * expire,
- 若请求介在[start,start + expire],则只读缓存即可;
- 若请求介在(start + expire,start + 2 * expire),则只透传一定比例(factor=10,表示比例为10%)的请求后端读取数据并更新缓存,其它请求继续使用当前缓存;
- 若缓存已失效,则直接请求后端读取数据;
基于锁的实现机制
- 将cache存储两倍的过期时间 2 * expire,
- 若请求介在[start,start + expire],则只读缓存即可;
- 若请求介在(start + expire,start + 2 * expire),则判断当前是否有请求锁;
- 若有,则说明已经有请求去后端读取数据,本次请求暂时使用缓存即可;
- 若无,则设置请求锁,并请求后端读取数据并更新缓存,成功后清除掉请求锁;
- 若缓存已失效,则直接请求后端读取数据;
代码如下:https://github.com/billfeller/blog.csdn.net-billfeller/blob/master/cache.php
方案评估
- 从最终结果来看,基于锁的实现机制能最大限度减少后端请求。以factor=10为例,理论上基于概率的实现机制可 以减少90%的请求数,但是基于锁的实现机制在任何场景下都能保证只有一次后端请求。
- 从实现上看,基于锁的实现机制需要额外的memcached操作,最坏情况下需要3次额外的memcached操作;
缓存策略优化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。