这种坑是怎么遇到的呢?memcached分配的内存远不满足业务存储数据所需内存的内存的时候,就会导致未过期的数据被过早释放,也就是被踢出去了,然后呢?然后就MMP了啊~老子的鉴权数据呢?明明设置很久过期的呀???
当时的解决方案是,用脚本遍历鉴权数据,发现问题随时补充进去。但没有解决本质的问题。后来在某篇博客找到的专业的分析,摘录部分内如下:
业务的服务器发生被踢的现象是由于保存了大量存活期短的key/value,且key是不重复的。另外又有一业务保存了小量不过期的数据,因此导致不过期的数据惨遭被挤到队列踢出。
几条总结:
- 过期的数据如果没被显式调用get,则也要占用空间。
- 过期的不要和不过期的数据存在一起,否则不过期的可能被踢。
- 从节约内存的角度考虑,即使数据会过期,也不要轻易使用随机字符串作为key,尽量使用定值如uid,这样占用空间的大小相对固定。
- 估算空间大小时候请用slab size计算,不要按value长度去计算。
- 不要把cache当作更快的key value store来用, cache不是storage。
以上内容部分摘录自:Memcached数据被踢(evictions>0)现象分析
其实吧,你特么为什么用memcache要保存失效特别久的鉴权数据呢?换Redis好了~
如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。
如本文对您有用,捐赠和留言 将是对我最好的支持~(捐赠可转为站内积分)
如愿意,请向朋友推荐本站,谢谢。
尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。