Redis淘汰原理
Redis里面的内存淘汰策略,是指当内存的使用率达到了最大内存的上限的时候,它的 一种内存释放的一个行为
Redis淘汰算法
- 随机,随机移除某个key
- TTL算法 就是在设置了过期时间的键里面呢,去找到更早过期的时间key进行有限的移除
- LRU算法去移除最近很少使用的key
- LFU算法跟LRU算法是类似的
LRU算法
LRU算法是一种常见的内存淘汰算法,在Redis里面它会维护一个大小为16的候选池,而这个候选池里面的数据。会根据时间进行排序,然后每一次随机抽取5个key,放入到这个候选池里面当候选池满了以后,访问时间间隔最大的key就会从候选池里面取出来淘汰掉,通过这一个设计就可以把真实的最少访问key从内存里面淘汰,但是这样的一种LRU算法还是会存在一个问题,假如一个key很长时间没有放问,但是最近一次偶然访问到那么LRU就会认为这个一个热点key不会被淘汰
LFU算法
所以在Redis4里面增加了一个LFU算法,相比LRU算法,LFU算法去增加了访问频率的这样一个维度来统计数据的热点情况,LFU主要使用了两个双向链表去形成一个二维的双向链表,一个用来保存访问频率,另一个用来访问频率相同的所有元素,当添加元素的时候访问频次默认为1
于是找到相同频次的节点,然后添加到相同频率节点对应的双向链表的头部,当元素被访问的时候呢就会增加对应key的访问频率,并且把访问的节点移动到下一个频次的节点,当然有可能会出现某个数据前期的访问次数很多,然后后续就一直不适用了,如果单纯按照这样一个访问频次来进行淘汰的话,那么这个key就很难被淘汰掉
所以,在LFU的算法里面去通过使用频率和上次访问时间来标记数据的这样一个热度,如果某个数据有读和写那么就增加访问的频率,如果一段时间内这个数据没有读写,那么就减少访问频率所以通过LFU算法改进之后,就可以真正达到非热点数据的淘汰,当然LFU也有缺点,相比LRU算法,LFU增加了访问频次的一个维护,以及实现的复杂度比LRU更高