什么是
memcache缓存雪崩?
传智播客上海校区
--崔长春老师
一.
什么是
memcache缓存雪崩?
没有使用缓存技术之前,数据获取需要查询数据库,但是从数据库获取数据本质还是从硬盘读取,他肯定没有从内存中读取速度快,程序工程师为了让用户体验更好,给数据加了缓存层,甚至是专门的缓存服务器。缓存技术各种各样,本文讨论
memcache缓存,程序语言用的是
php
。
加了
memcache缓存之后,程序的逻辑通常变成这样:
[AppleScript]
纯文本查看
复制代码
1 2 3 4 5 6 7 8 9 | $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. 主从复制,读写分离,就是用多台服务器来扛。