Blogger Information
Blog 42
fans 3
comment 2
visits 93349
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Memcache 缓存雪崩、缓存无底洞、缓存穿透、永久数据被踢现象
Whitney的博客
Original
1387 people have browsed it

Memcache 缓存雪崩、缓存无底洞、缓存穿透、永久数据被踢现象

一、memcache缓存雪崩现象

缓存雪崩一般是由某个缓存节点失效,导致其他节点的缓存命中率下降,缓存中缺失的数据去数据库查询,短时间内造成数据库服务器崩溃,重启DB短期又被压垮,但新数据的缓存也更新一些,DB反复多次启动多次,缓存重建完毕,DB才稳定运行,或者是由于缓存周期性的失效,比如缓存失效周期相同,在一个时间点缓存同时失效,将会有一个请求峰值,严重者甚至会造成DB崩溃。

解决办法:把缓存设置为不同的生命周期,这样不同时失效,把工作分担到各个时间点上去,也可以自己写脚本,放到业务比较空闲的时候自己刷新创建缓存,比如放置在凌晨时分。

二、缓存的无底洞现象 multiget-hole

Memcache 的节点非常多,memcache连接频率、效率下降,于是增加memcache节点,发现因为连接频率导致的问题仍然存在称之为“无底洞现象”。

以用户信息为例:一个用户有很多的信息,user1-age,user1-name,user1-height,当服务器增多,用户的信息也被散落在更多的节点,user1-age散落在a节点,user1-name散落在b节点,user1-height散落在c节点,这时候同样获取这个人的用户信息就要连接多个节点,节点越多需要连接的节点也就越多,对于memcache的连接数,并没有随着节点的增多而降低。于是问题出现。

解决方案:在保存用户信息的时候key键使用共同的前缀进行保存,如使用user1作为键,而不是user1-age单独作为键。

三、缓存穿透现象

在按照key去缓存查询一个一定不存在的数据,由于缓存未命中需要从数据库查询,数据库未查询到数据也不做缓存,并且对该key并发请求量很大,就会对系统造成很大的压力,这就是缓存穿透。

解决方案:当查询返回额数据为空时,我们仍然把这个空结果缓存并设置一个相对较短的生命周期。

四、永久数据被踢现象

缓存数据时已经设为永久有效,却莫名其妙的丢失了,这是因为memcache的惰性删除机制,即LRU最近最少使用删除机制,当某个单元被请求时,memcache维护一个计数器,通过计数器来判断最近最少被使用的是谁就把谁踢出,即使是永久有效的数据,如果一直没有被使用,而库又满了的情况下,就会把这个永久数据踢出。

解决方法:永久数据和非永久数据分开存放。

 

本文参考:https://www.cnblogs.com/52lnamp/p/9640702.html


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post