一、LRU删除机制
a) 当某个值过期后,并没有从内存删除,因此stats统计时,curr_item有其信息。
b) 当get其值时,判断是否过期,如果过期就返回空并删除。
c) 当添加新值去占用它的位置时,把它当成空chunk来占用位置。
注:数据过期只是不让用户看到数据,并没有真正删除,该行为称为lazy expiration(惰性失效)。如果chunk占满了,又有新的值加入则根据LRU删除机制挤掉最近最少用的数据(最旧的)。
二、分布式之取模算法的缺陷
a) 假设有8台服务器,运行中突然down一台,则求余的底数变成了7,后果key9%/8==1变成key9%7==2 miss(没命中)
。。。。。。
key55%/8==7变成key55%7==6 miss(没命中)
所以服务器在down短期内,命中率急剧下降。
因此采用一致性哈希分布式算法实现。
三、缓存雪崩现象
一般是指某个节点失效,导致其他节点的缓存命中率下降,短时间内缺失大量缓存数据(或缓存数据大量失效)需要去数据库查询,造成数据库服务器崩溃。
a) 把缓存设置为随机3到9小时的生命周期,不同时期失效,分散失效时间点。
b) 把缓存时间调长,夜里(或服务器负载低的时候)跑脚本刷新缓存。
四、缓存无底洞现象
是指memcached连接频繁,效率下降了,因此添加了memcached节点,添加后连接频率高导致的问题仍然存在,该现象称之为无底洞现象。
a) 对于memcached和redis这种key-value存储,key的设计可以参考mysql中表/列的设计,比如user表下的的age,name列。把某一组key,按其共同前缀来分布,key应该设计为: user-133,而不是user-133-age,user-133-name.
五、永久数据被踢现象
a) 原因:惰性删除与LRU最少使用记录删除
b) 解决:永久数据和非永久数据分开