Redis淘汰策略LRU笔记

前言

2020年3月份,为了配置Redis淘汰策略而学习。
资料看过就忘,所以以自己理解写点笔记。

LRU算法是什么,为什么会出现

  • 背景:内存占用告急,需要淘汰信息的策略,Least Recent Used淘汰不常用的。

  • 原理:固定大小"队伍",队头存入,队尾淘汰,被引用数据移动至队头

  • 实现:

    • 队列实现:可先进先出,但无法移动数据到队头
    • 单链表实现:可头部存入尾部删除,但是只有头指针,删除数据时间复杂度O(n),寻找数据同样效率低下
    • HashMap+双向链表:Key存对象,Value存位置,定位数据O(1),头尾双指针效率高,但耗费较大空间储存放 next 和 prev 指针,一般原理都指向这种。

Redis的LRU策略是什么

  • 实现:出于节省内存的考虑,Redis是LRU非完整实现。
    • Redis Object挤出了24bits的空间,少的可怜,可存下低位的时间戳unix time
    • unix time时间戳取自LRU clock,分辨度1s,更新频率100ms。
    • 维护一个pool,随机N个key,比pool中更老旧的被放入,从pool选择key淘汰。
  • 不足:举个例子,D的淘汰概率最小,但是高频请求的B更应该被留下。
~~~~~A~~~~~A~~~~~A~~~~A~~~~~A~~~~~A~~|
~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~|
~~~~~~~~~~C~~~~~~~~~C~~~~~~~~~C~~~~~~|
~~~~~D~~~~~~~~~~D~~~~~~~~~D~~~~~~~~~D|

~ 代表间隔
| 代表时间截止
ABC 代表数据被get

Redis的LFU策略又是什么

Least Frequently Used 最近最少使用,跟使用的次数有关,淘汰使用次数最少的

  • 实现:
    • Redis Object挤出了24bits的空间
           16 bits      8 bits
      +----------------+--------+
      + Last decr time | LOG_C  |
      +----------------+--------+
      最近一次计数器降低的时间(分钟) 计数器数值counter
    • counter通过访问次数增加,随机数撞击因子的结果概率性增长,参考莫里斯计数器。
    • 新生key默认counter为5,防止被过早淘汰。
    • 定时衰减counter
    • 同样有随机N个key抽样,和pool数据比较,从pool中淘汰counter较小key。

可控参数:

lfu-log-factor默认10,控制counter的增长概率,反比。

lfu-decay-time默认1,单位分钟,控制衰减周期。

注:阿里云Redis没有上述参数配置,已发过工单

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Click#593

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值