这种坑是怎么遇到的呢?memcached分配的内存远不满足业务存储数据所需内存的内存的时候,就会导致未过期的数据被过早释放,也就是被踢出去了,然后呢?然后就MMP了啊~老子的鉴权数据呢?明明设置很久过期的呀???

当时的解决方案是,用脚本遍历鉴权数据,发现问题随时补充进去。但没有解决本质的问题。后来在某篇博客找到的专业的分析,摘录部分内如下:

业务的服务器发生被踢的现象是由于保存了大量存活期短的key/value,且key是不重复的。另外又有一业务保存了小量不过期的数据,因此导致不过期的数据惨遭被挤到队列踢出。

几条总结:

  1. 过期的数据如果没被显式调用get,则也要占用空间。
  2. 过期的不要和不过期的数据存在一起,否则不过期的可能被踢。
  3. 从节约内存的角度考虑,即使数据会过期,也不要轻易使用随机字符串作为key,尽量使用定值如uid,这样占用空间的大小相对固定。
  4. 估算空间大小时候请用slab size计算,不要按value长度去计算。
  5. 不要把cache当作更快的key value store来用, cache不是storage。

以上内容部分摘录自:Memcached数据被踢(evictions>0)现象分析

其实吧,你特么为什么用memcache要保存失效特别久的鉴权数据呢?换Redis好了~

Related Posts: Memcached数据过早被释放被踢的坑 :

留言

avatar