前言
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没有上述参数配置,已发过工单
参考: