Redis内存淘汰策略

长期将Redis作为缓存使用,难免会遇到内存空间存储瓶颈,当Redis内存超出物理内存限制时,内存数据就会与磁盘产生频繁交换,使Redis性能急剧下降。此时如何淘汰无用数据释放空间,存储新数据就变得尤为重要了。

LRU(Least Recently Used)最近最少使用的key予以淘汰,是Redis唯一支持的回收方法。

Maxmemory配置指令

maxmemory配置指令用于配置Redis存储数据时指定限制的内存大小。

设置maxmemory为0代表没有内存限制。对于64位的系统这是个默认值,对于32位的系统默认内存限制为3GB。

当指定的内存限制大小达到时,需要选择不同的行为,也就是策略。 Redis可以仅仅对命令返回错误,这将使得内存被使用得更多,或者回收一些旧的数据来使得添加数据时可以避免内存限制。

回收策略

当maxmemory限制达到的时候Redis会使用的行为由 Redis的maxmemory-policy配置指令来进行配置。

以下的策略是可用的:

  • noeviction:是Redis默认内存回收策略,返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
  • allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
  • volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
  • allkeys-random: 回收随机的键使得新添加的数据有空间存放。
  • volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
  • volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

严格LRU算法

  • 维护一个链表,将所有设置了过期时间的key放在这个链表中
  • 当字典中某个元素被访问时,它在链表中的位置会被移动到链表的头部
  • 当空间满时,就从链表尾部开始移除元素

Redis的近似LRU算法

  • Redis 使用的是一种近似 LRU 算法,之所以不用传统的 LRU 是因为它引入了链表,会占用较多的内存。
  • 近似 LRU 算法在现有数据结构的基础上采用随机采样的方式来淘汰元素,它为每个 key 增加了一个最后一次被访问的时间戳,当内存不足时,就执行一次近似 LRU 算法,具体步骤是随机采样 5 个 key,这个采样个数默认为 5,然后根据时间戳淘汰掉最旧的那个 key,如果淘汰后内存还是不足,就继续随机采样来淘汰。这里的淘汰策略如果设置的是 allkeys,就从所有 key 中随机采样,如果设置的是 volatile,就从设有过期时间的 key 中随机采样,采样值越大,效果就越接近传统的 LRU 算法。
  • redis 3.0 在算法中增加了淘汰池,进一步提升了近似 LRU 算法的效果。具体原理是构建一个淘汰池数组,在每一次淘汰循环中,新随机采样的 key 会和淘汰池中的 key 进行融合,淘汰掉最旧的那个 key 后,保留剩余的 key 放入淘汰池中等待下一次循环。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值