memcache 缓存失效问题(转)

在大并发的场合,当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();
}
}
}

memcache 缓存失效问题(转)

时间: 2024-11-06 00:05:42

memcache 缓存失效问题(转)的相关文章

应对Memcache缓存失效,导致高并发查询DB

当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升. 这篇blog主要是探讨如何在缓存将要失效时,及时地更新缓存,而不是如何在缓存失效之后,如何防止高并发的DB查询. 解决这个问题有四种思路: 比如一个key是aaa,失效时间是30s. 1.定期从DB里查询数据,再刷到memcached里 这种方法有个缺点是,有些业务的key可能是变化的,不确定的. 而且不好界定哪些数据是应该查询出来放到缓存中的,难以区分冷热数据. 2.当缓存取到为null时,加锁去查询DB,只允许

Memcache缓存服务器(Nginx+php+Memcache+MySQL)

一.MemCache简介: MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度.MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串.对象等)所使用的key-value存储,数据可以来自数据库调用.API调用,或者页面渲染的结果.MemCache设计理念就是小而强大,它简单的设计促进了快速部署.易于开发并解决面对大规模的数据缓

Linux之搭建memcache缓存服务器

Linux之搭建memcache缓存服务器(一) 一.MemCache简 session MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度. MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串.对象等)所使用的key-value存储,数据可以来自数据库调用.API调用,或者页面渲染的结果.MemCache设计理念就是小而强

图文并茂超详细搭建memcache缓存服务器(nginx+php+memcache+mysql)

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一.MemCache简述 session MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度. MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串.对象等)所使用的k

云计算openstack共享组件(2)——Memcache 缓存系统

一.缓存系统 在大型海量并发访问网站及openstack等集群中,对于关系型数据库,尤其是大型关系型数据库,如果对其进行每秒上万次的并发访问,并且每次访问都在一个有上亿条记录的数据表中查询某条记录时,其效率会非常低,对数据库而言,这也是无法承受的. 缓冲系统的使用可以很好的解决大型并发数据访问所带来的效率低下和数据库压力等问题,缓存系统将经常使用的活跃数据存储在内存中避免了访问重复数据时,数据库查询所带来的频繁磁盘i/o和大型关系表查询时的时间开销,因此缓存系统几乎是大型网站的必备功能模块. 缓

OpenStack共享组件-Memcache缓存系统

1. 缓存系统 1.1 静态web页面 1> 在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告诉服务器我现在需要得到哪个页面,所有的请求交给Web服务器,之后WEB服务器根据用户的需要,从文件系统(存放了所有静态页面的磁盘)取出内容.之后通过Web服务器返回给客户端,客户端接收到内容之后经过浏览器渲染解析,得到显示的效果. 2> 为了让静态web页面显示更加好看,使用javascri

云计算OpenStack共享组件---Memcache缓存系统(3)

一.缓存系统 1.静态web页面: (1)在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告诉服务器我现在需要得到哪个页面,所有的请求交给Web服务器,之后WEB服务器根据用户的需要,从文件系统(存放了所有静态页面的磁盘)取出内容.之后通过Web服务器返回给客户端,客户端接收到内容之后经过浏览器渲染解析,得到显示的效果. (2)为了让静态web页面显示更加好看,使用javascript/

LNMP动静分离&amp;&amp;memcache缓存服务器

博文大纲:一.MemCache简介 1.协议 2.事件处理 3.存储方式 4.通信分布式 5.memcached的应用场景 6.memcached应用中的工作流程 7.memcached的一致性Hash算法二.部署LNMP动静分离&&memcache缓存服务器 1.环境准备 2.部署Nginx服务器 3.部署PHP服务器 4.部署MySQL数据库 5.部署Memcached服务器 6.部署memcache客户端 7.使用 memcache 实现 session 共享 8.测试memcach

部署LNMP动静分离并搭建memcache缓存服务器

一.MemCache简介MemCache 是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度. MemCaChe 是一个存储键值对的 HashMap,在内存中对任意的数据(比如字符串.对象等)所使用的 key-value 存储,数据可以来自数据库调用.API调用,或者页面渲染的结果.MemCache 设计理念就是小而强大,它简单的设计促进了快速部署.易于开发并解决面对大规