一、缓存雪崩
缓存雪崩一般是由某个缓存节点失效,导致其他节点的缓存命中率下降,缓存中缺失的数据就会去数据库查询,短时间内造成数据库服务器崩溃。重启数据库短期内又被压垮,但缓存数据也多了一些,反复多次重启数据库,才使得数据库稳定运行。
或者,是由于缓存周期性的失效,比如每6小时失效一次,那么每6小时,将有一个请求峰值,严重者甚至会令数据库崩溃。
案例:设置了每6小时刷新缓存
解决方法:
调整缓存时间,每天夜里刷新缓存
或者,把缓存设置为随机3到9小时的生命周期,这样不同时失效,把刷新缓存的工作分担到各个时间点上去。
二、无底洞现象
memcached连接频率的增高,导致效率的下降。在添加memcached节点后,因为连接频率的增高导致的问题,仍然存在,并没有好转,称之为无底洞现象。
造成无底洞现象发生的原因是缓存数据太分散,相同key的缓存分散在各个memcached节点上。
解决方法:
设计合理的key,使相同key的缓存存放在同一个memcached节点上。
三、永久数据被踢现象
1、memcached的过期数据惰性删除
这个过期,只是让用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除。这个称为lazy expiration,惰性失效。这样节省了时间和检测的成本。
(1)、当某个值过期后,并没有从内存中删除,因此stats统计时,curr_item有其信息。
设置键为aaa,值为a,过期时间为10秒的缓存,此时curr_item的值为4。
10秒后缓存过期后,查看curr_item的值并未变化。
(2)、当某个新值去占用他的位置时,当成空chunk来占用。
(3)、当get值时,判断是否过期,如果过期,返回空,并且清空,curr_item就减少了。
获取键为aaa的缓存数据。
然后,再次查看curr_item的值变成了3。
2、memcached采用Iru删除机制
Iru(least recently used)最近最少使用。Iru删除机制,删除最近最少使用的。即使某个key的过期时间expire设置的是0,也一样会被踢出来,这种现象称为永久数据被踢现象。
解决方法:永久数据和非永久数据分开存放。