本帖最后由 为热爱挥汗 于 2018-12-25 10:31 编辑
什么是memcache缓存雪崩? 传智播客上海校区 --崔长春老师
一.什么是memcache缓存雪崩? 没有使用缓存技术之前,数据获取需要查询数据库,但是从数据库获取数据本质还是从硬盘读取,他肯定没有从内存中读取速度快,程序工程师为了让用户体验更好,给数据加了缓存层,甚至是专门的缓存服务器。缓存技术各种各样,本文讨论memcache缓存,程序语言用的是php。 加了memcache缓存之后,程序的逻辑通常变成这样: [AppleScript] 纯文本查看 复制代码 $data=$memcache->get(键);
if($data){
return $data;
}else{
//1.读取数据库,获取对应数据$data。此处略
//2.将数据存入缓存,接着return 数据
$memcache->set(键,$data);
return $data;
} 有了这层缓存,第一个用户请求此数据需要查询数据库,后面的用户请求此数据就可以从缓存中查询,减轻了数据库压力,同时给用户的响应更快,体验更好了。 理想总是如此美好,现在现实来了,如果这些数据集中过期,或者是memcache服务器挂掉,在缓存中得不到数据,会导致大量请求都来查询数据库,数据库的压力瞬间变大,数据库甚至会因此挂掉。这就是缓存雪崩。 对于多个memcache服务器情况,例如分布式memcache服务器,某一个节点失效(例如宕机),会导致其他的节点的缓存命中率下降,大量的数据需要查询数据库,短时间内造成的数据库服务器崩溃。DB反复的多次的启动,多次缓存才能建立完毕,DB才能稳定的运行,这也叫缓存雪崩。 下面是缓存雪崩的形象化图示:
正常情况 缓存雪崩 正常时大量数据取自缓存,雪崩后大量数据来自数据库。 二.如何解决memcache缓存雪崩? 从缓存雪崩的现象可以看出解决缓存雪崩的办法,主要如下: 1. 分析用户行为,尽量让失效时间点均匀分布 2. 可以选择闲时过期; 3. 主从复制,读写分离,就是用多台服务器来扛。
|