当前位置:网站首页>redis淘汰策略
redis淘汰策略
2022-06-30 15:48:00 【我们一直在路上】
一、最大内存设置
redis 默认的最大的内存设置为0,相当于基于物理机的最大值
二、淘汰策略
1. 8种策略
- volatile-lru,针对设置了过期时间的key,使用lru算法进行淘汰。
- allkeys-lru,针对所有key使用lru算法进行淘汰。
- volatile-lfu,针对设置了过期时间的key,使用lfu算法进行淘汰。
- allkeys-lfu,针对所有key使用lfu算法进行淘汰。
- volatile-random,从所有设置了过期时间的key中使用随机淘汰的方式进行淘汰。
- allkeys-random,针对所有的key使用随机淘汰机制进行淘汰。
- volatile-ttl,删除生存时间最近的一个键。
- noeviction(默认),不删除键,值返回错误。
主要是4种算法,针对不同的key,形成的策略。
算法:
- lru 最近很好的使用的key(根据时间,最不常用的淘汰)
- lfu 最近很好的使用的key (根据计数器,用的次数最少的key淘汰)
- random 最难淘汰
- ttl 快要过期的先淘汰
key :
- volatile 有过期的时间的那些key
- allkeys 所有的key
2.内存淘汰算法的具体工作原理是:
- 客户端执行一条新命令,导致数据库需要增加数据(比如set key value)
- Redis会检查内存使用,如果内存使用超过 maxmemory,就会按照置换策略删除一些 key
- 新的命令执行成功
三、lru和lfu算法
1.lru
LRU是Least Recently Used的缩写,也就是表示最近很少使用,也可以理解成最久没有使用。也就是说当内存不够的时候,每次添加一条数据,都需要抛弃一条最久时间没有使用的旧数据。标准的LRU算法为了降低查找和删除元素的时间复杂度,一般采用Hash表和双向链表结合的数据结构,hash表可以赋予链表快速查找到某个key是否存在链表中,同时可以快速删除、添加节点,如图所示。
双向链表的查找时间复杂度是O(n),删除和插入是O(1),借助HashMap结构,可以使得查找的时间复杂度变成O(1),Hash表用来查询在链表中的数据位置,链表负责数据的插入.
当新数据插入到链表头部时有两种情况
- 当链表中没有这个key,且链表满了,把链表尾部的数据丢弃掉,新加入的缓存直接加入到链表头中。
- 当链表中的某个缓存被命中时,直接把数据移到链表头部,原本在头节点的缓存就向链表尾部移动
这样,经过多次Cache操作之后,最近被命中的缓存,都会存在链表头部的方向,没有命中的,都会在链表尾部方向,当需要替换内容时,由于链表尾部是最少被命中的,我们只需要淘汰链表尾部的数据即可。
2.redis中的lru算法
实际上,Redis使用的LRU算法其实是一种不可靠的LRU算法,它实际淘汰的键并不一定是真正最少使用的数据,它的工作机制是:
- 随机采集淘汰的key,每次随机选出5个key
- 然后淘汰这5个key中最少使用的key
这5个key是默认的个数,具体的数值可以在redis.conf中配置

当近似LRU算法取值越大的时候就会越接近真实的LRU算法,因为取值越大获取的数据越完整,淘汰中、的数据就更加接近最少使用的数据。这里其实涉及一个权衡问题,
如果需要在所有的数据中搜索最符合条件的数据,那么一定会增加系统的开销,Redis是单线程的,所以耗时的操作会谨慎一些。为了在一定成本内实现相对的LRU,早期的Redis版本是基于采样的LRU,也就是放弃了从所有数据中搜索解改为采样空间搜索最优解。Redis3.0版本之后,Redis作者对于基于采样的LRU进行了一些优化:
- Redis中维护一个大小为16的候选池,当第一次随机选取采用数据时,会把数据放入到候选池中,并且候选池中的数据会更具时间进行排序。
- 当第二次以后选取数据时,只有小于候选池内最小时间的才会被放进候选池。
- 当候选池的数据满了之后,那么时间最大的key就会被挤出候选池。当执行淘汰时,直接从候选池中选取最近访问时间小的key进行淘汰。
如图4-22所示,首先从目标字典中采集出maxmemory-samples个键,缓存在一个samples数组中,然后从samples数组中一个个取出来,和回收池中以后的键进行键的空闲时间,从而更新回收池。
- 回收池满了,并且当前插入的key的空闲时间最小(也就是回收池中的所有key都比当前插入的key的空闲时间都要大),则不作任何操作。
- 回收池未满,并且插入的位置x没有键,则直接插入即可
- 回收池未满,且插入的位置x原本已经存在要淘汰的键,则把第x个以后的元素都往后挪一个位置,然后再执行插入操作。
- 回收池满了,将当前第x个以前的元素往前挪一个位置(实际就是淘汰了),然后执行插入操作。
这样做的目的是能够选出最真实的最少被访问的key,能够正确不常使用的key。因为在Redis3.0之前是随机选取样本,这样的方式很有可能不是真正意义上的最少访问的key。
缺点:
LRU算法有一个弊端,加入一个key值访问频率很低,但是最近一次被访问到了,那LRU会认为它是热点数据,不会被淘汰。同样,
经常被访问的数据,最近一段时间没有被访问,这样会导致这些数据被淘汰掉,导致误判而淘汰掉热点数据,于是在Redis 4.0中,新加了一种LFU算法。
2.lfu
LFU(Least Frequently Used),表示最近最少使用,它和key的使用次数有关,其思想是:根据key最近被访问的频率进行淘汰,比较少访问的key优先淘汰,反之则保留。
LRU的原理是使用计数器来对key进行排序,每次key被访问时,计数器会增大,当计数器越大,意味着当前key的访问越频繁,也就是意味着它是热点数据。 它很好的解决了LRU算法的缺陷:一个很久没有被访问的key,偶尔被访问一次,导致被误认为是热点数据的问题。
LFU的实现原理如图4-23所示
LFU维护了两个链表,横向组成的链表用来存储访问频率,每个访问频率的节点下存储另外一个具有相同访问频率的缓存数据。具体的工作原理是:
- 当添加元素时,找到相同访问频次的节点,然后添加到该节点的数据链表的头部。如果该数据链表满了,则移除链表尾部的节点当获取元素或者修改元素是,都会增加对应key的访问频次,并把当前节点移动到下一个频次节点。
- 添加元素时,访问频率默认为1,随着访问次数的增加,频率不断递增。而当前被访问的元素也会随着频率增加进行移动。
边栏推荐
- 搬运两个负载均衡的笔记,日后省的找
- [wechat applet] basic use of common components (view/scroll-view/wiper, text/rich-text, button/image)
- 数据库系统概论习题册
- Etcd tutorial - Chapter 9 etcd implementation of distributed locks
- Bidding announcement: Taizhou Unicom Oracle all in one machine and database maintenance service project in 2022
- MicroBlaze serial port learning · 2
- 【Verilog基础】关于Clock信号的一些概念总结(clock setup/hold、clock tree、clock skew、clock latency、clock transition..)
- Mathematical modeling for war preparation 35 time series prediction model
- Niuke network: longest continuous subarray with positive product
- 更多龙蜥自研特性!生产可用的 Anolis OS 8.6 正式发布
猜你喜欢

Mathematical modeling for war preparation 34-bp neural network prediction 2

Tutoriel etcd - chapitre 8 API compacte, Watch et lease pour etcd
![[wechat applet] basic use of common components (view/scroll-view/wiper, text/rich-text, button/image)](/img/3b/05dbf03024088c5f94363f157a1701.png)
[wechat applet] basic use of common components (view/scroll-view/wiper, text/rich-text, button/image)

halcon知识:区域专题【07】

15年做糊21款硬件,谷歌到底栽在哪儿?

搬运两个负载均衡的笔记,日后省的找

Restartprocessifvisible process
![[wechat applet] the hosting environment of the applet](/img/ee/0f1dee4a26eb62c2268484c1b59edf.png)
[wechat applet] the hosting environment of the applet

更多龙蜥自研特性!生产可用的 Anolis OS 8.6 正式发布

HMS Core音频编辑服务3D音频技术,助力打造沉浸式听觉盛宴
随机推荐
数据挖掘知识点整理(期末复习版)
GaussDB创新特性解读:Partial Result Cache,通过缓存中间结果对算子进行加速
[BJDCTF2020]The mystery of ip|[CISCN2019 华东南赛区]Web11|SSTI注入
安全帽佩戴检测算法研究
JS Es5 can also create constants?
I implement "stack" with C I
The new tea drinks are "dead and alive", but the suppliers are "full of pots and bowls"?
9: Chapter 3: e-commerce engineering analysis: 4: [general module]; (to be written...)
STL tutorial 7-set, pair pair pair group and functor
RT-Thread 堆区大小设置
更多龙蜥自研特性!生产可用的 Anolis OS 8.6 正式发布
备战数学建模33-灰色预测模型2
Half year inventory of new consumption in 2022: the industry is cold, but these nine tracks still attract gold
互联网研发效能实践之去哪儿网(Qunar)核心领域DevOps落地实践
15年做糊21款硬件,谷歌到底栽在哪儿?
Hologres shared cluster helps Taobao subscribe to the extreme refined operation
Rong Lianyun launched rphone based on Tongxin UOS to create a new ecology of localization contact center
RT thread heap size Setting
牛客网:乘积为正数的最长连续子数组
Jspreadsheet/ce JExcel: more data fields than the given fields (columns) will lead to blank columns. Solution