|NO.Z.00017|——————————|BigDataEnd|——|Hadoop&Redis.V17|——|Redis.v17|缓存过期|淘汰策略.v03|
一、Redis的LRU数据淘汰机制
### --- Redis的LRU数据淘汰机制
~~~ # 在服务器配置中保存了
~~~ lru 计数器 server.lrulock,会定时(redis 定时程序 serverCorn())更新,
~~~ server.lrulock 的值是根据 server.unixtime 计算出来的。
~~~ # 另外,
~~~ 从 struct redisObject 中可以发现,每一个 redis 对象都会设置相应的 lru。
~~~ 可以想象的是,每一次访问数据的时候,会更新 redisObject.lru。
~~~ # LRU 数据淘汰机制是这样的:
~~~ 在数据集中随机挑选几个键值对,取出其中 lru 最大的键值对淘汰。
~~~ 不可能遍历key 用当前时间-最近访问 越大 说明 访问间隔时间越长
~~~ # volatile-lru
~~~ 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
~~~ # allkeys-lru
~~~ 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
二、LFU
### --- LFU
~~~ LFU (Least frequently used) 最不经常使用,
~~~ 如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小。
~~~ # volatile-lfu
~~~ allkeys-lfu
~~~ # random
~~~ 随机
~~~ # volatile-random
~~~ 从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
~~~ # allkeys-random
~~~ 从数据集(server.db[i].dict)中任意选择数据淘汰
三、ttl
### --- volatile-ttl
~~~ # 从已设置过期时间的数据集(server.db[i].expires)
~~~ 中挑选将要过期的数据淘汰redis 数据集数据结构中保存了键值对过期时间的表,
~~~ 即 redisDb.expires。
~~~ # TTL 数据淘汰机制:
~~~ 从过期时间的表中随机挑选几个键值对,取出其中 ttl 最小的键值对淘汰。
### --- noenviction
~~~ 从数据集(server.db[i].dict)中任意选择数据淘汰
~~~ 禁止驱逐数据,不删除 默认
四、缓存淘汰策略的选择
### --- 缓存淘汰策略的选择
~~~ allkeys-lru : 在不确定时一般采用策略。 冷热数据交换
~~~ volatile-lru : 比allkeys-lru性能差 存 : 过期时间
~~~ allkeys-random : 希望请求符合平均分布(每个元素以相同的概率被访问)
~~~ 自己控制:volatile-ttl 缓存穿透
五、案例分享:字典库失效
### --- 字典库失效
~~~ key-Value 业务表存 code 显示 文字拉勾早期将字典库,
~~~ 设置了maxmemory,并设置缓存淘汰策略为allkeys-lru结果造成字典库某些字段失效,
~~~ 缓存击穿 , DB压力剧增,差点宕机。
### --- 分析:
~~~ # 字典库 :
~~~ Redis做DB使用,要保证数据的完整性maxmemory设置较小,
~~~ 采用allkeys-lru,会对没有经常访问的字典库随机淘汰当再次访问时会缓存击穿,
~~~ 请求会打到DB上。
### --- 解决方案:
~~~ 不设置maxmemory
~~~ 使用noenviction策略
~~~ Redis是作为DB使用的,要保证数据的完整性,所以不能删除数据。
~~~ 可以将原始数据源(XML)在系统启动时一次性加载到Redis中。
~~~ Redis做主从+哨兵 保证高可用
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv012-redis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通