搜索
博主信息
博文 42
粉丝 3
评论 2
访问量 104346
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
Memcache 缓存雪崩、缓存无底洞、缓存穿透、永久数据被踢现象
Whitney的博客
原创
1583人浏览过

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


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学