博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcache 缓存失效问题(转)
阅读量:6935 次
发布时间:2019-06-27

本文共 1382 字,大约阅读时间需要 4 分钟。

在大并发的场合,当cache失效时,大量并发同时取不到cache,会同一瞬间去访问db并回设cache,可能会给系统带来潜在的超负荷风险。

解决方法

方法一 

在load db之前先add一个mutex key, mutex key add成功之后再去做加载db, 如果add失败则sleep之后重试读取原cache数据。为了防止死锁,mutex key也需要设置过期时间。伪代码如下

if (memcache.get(key) == null) {    // 3 min timeout to avoid mutex holder crash    if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {        value = db.get(key);        memcache.set(key, value);        memcache.delete(key_mutex);    } else {        sleep(50);        retry();    }} 方法二 在value内部设置1个超时值(timeout1), timeout1比实际的memcache timeout(timeout2)小。当从cache读取到timeout1发现它已经过期时候,马上延长timeout1并重新设置到cache。然后再从数据库加载数据并设置到cache中。伪代码如下v = memcache.get(key);if (v == null) {    if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {        value = db.get(key);        memcache.set(key, value);        memcache.delete(key_mutex);    } else {        sleep(50);        retry();    }} else {    if (v.timeout <= now()) {        if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {            // extend the timeout for other threads            v.timeout += 3 * 60 * 1000;            memcache.set(key, v, KEY_TIMEOUT * 2);            // load the latest value from db            v = db.get(key);            v.timeout = KEY_TIMEOUT;            memcache.set(key, value, KEY_TIMEOUT * 2);            memcache.delete(key_mutex);        } else {            sleep(50);            retry();        }    }}

 

转载地址:http://tjgjl.baihongyu.com/

你可能感兴趣的文章
DOM节点删除方法小结
查看>>
LeetCode 简要日记 455 & 104
查看>>
(十三) 构建dubbo分布式平台-dubbo管控台安装
查看>>
详解动态规划最长公共子序列--JavaScript实现
查看>>
使用索引绘图(转)
查看>>
Kafka简单使用
查看>>
常用的布局?
查看>>
Java并发编程实战笔记2:对象的组合
查看>>
GreenDao使用注意事项
查看>>
HTTP协议
查看>>
Filter 设计模式编码实践
查看>>
华山论剑之浅谈iOS的生产线 工厂模式
查看>>
人人都能学会的python编程教程14:高级特性1
查看>>
sticky list item
查看>>
如何用树莓派和PHP开发一个比特币和以太坊交易机器人
查看>>
为什么说百度教育大脑3.0,是中国教育迎来的真正智慧大脑?
查看>>
Raft只读操作实现要点
查看>>
逆向世界杯直播App 央视影音-iOS客户端
查看>>
MediaCodec 解码后数据对齐导致的绿边问题
查看>>
Netty源码解析4-Handler综述
查看>>