当前位置:首页 > 内存 > 正文

redis内存淘汰算法

  • 内存
  • 2024-06-15 13:12:08
  • 6742

一、Redis过期键删除策略和内存淘汰策略懒惰删除+定期删除
key过期后,并不会立即删除。使用时会先判断key是否过期,如果过期则删除。
对不内存友好,CPU友好
偶尔随机识别部分数据(不是全部)是否过期,过期则删除
参数用于配置每秒执行多少次周期性删除。默认值为10,即100ms/次

中的maxmemory-samples参数用于指定每次检测多少数据。标准5
不适合CPU,内存友好

中的maxmemory参数配置了redis的最大内存,maxmemory策略配置了内存淘汰策略,当redis内存达到最大后,会根据内存淘汰策略淘汰部分数据。
redis提供了8种内存驱逐策略:
no-eviction:当内存达到最大时,无法写入新数据,并报错
allkeys-lru:当内存达到最大时,淘汰最近最少使用的数据(最常用的策略)
allkeys-random:当内存达到最大时,随机淘汰
allkeys-lfu:当内存达到最大值时,最近最少使用的数据会被淘汰
     volatitle-lru:当内存达到最大值时,最近最少使用的数据会从过期的数据中淘汰键设置最少使用的数据
   volatitle-ttl:当内存到达时。最大,最早过期的数据被淘汰
 标准LRU算法需要维护一个链表,链表按照使用时间排序,当需要删除数据时,会从尾部删除部分数据链接列表。
标准的LRU算法需要大量的计算,而redis使用了类似于LRU算法的操作。
redis为每个key维护一个24位的属性字段来记录最后使用的时间戳。Redis根据maxmemory样本随机抽取部分数据,淘汰最旧的数据,减少内存。后来redis引入了淘汰池。淘汰池中的数据量等于maxmemory-samples。剩余最旧的数据将被保留到淘汰池中,等待下一个周期。
为什么需要LFU算法?
现在假设这样一个场景:redis中有两个键A和B,它们的使用频率如上所示,当达到$时,因为A的使用晚于B,根据LRU算法,淘汰B,但是从使用频率来看,B的使用频率明显高于A,所以应该淘汰A。
为了解决上述问题,Redis引入了LFU算法来淘汰最少使用的数据。原理如下:
LFU为每个数据维护一个计数器,每次使用都会增加计数器并消除使用最少的密钥。但这又产生了新的问题:
①如果一个新的key的计数器为0,那么它就可以一直被淘汰
Redis的解决方案:redis给每个新的key一个初始值计数器的值
②某个按键可能在前一段时间被频繁使用,但在一定时间后使用频率会降低。
    Redis解决方案:如果某个key一段时间内没有使用,计数器就会递减

二、redis淘汰策略有哪些详细信息就在下面。
volatile-lru:从哈希表中随机选择多个具有过期时间([i].expires)的键,并对所选键使用lallkey-lru:从哈希表()中选择所有键[i].expires)从哈希表([i].dict)中随机选择多个键,并使用lru算法进行选择从键中删除volatile-ttl。选择哈希表(.db[i]].expires,服务器过期)并在所选键中选择.volatile-random:哈希表([i].expires)。allkeys-random:从所有key的哈希表([i].dict)中随机选择并删除数据。
Redis是一个采用ANSIC语言编写的开源日志型键值数据库,具有网络支持、基于内存的持久性,并提供多种语言的API。