浅谈Redis中的内存淘汰策略和过期键删除策略

 更新时间:2021年09月15日 11:29:53   作者:纪先生  
本文主要介绍了浅谈Redis中的内存淘汰策略和过期键删除策略,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

redis是我们现在最常用的一个工具,帮助我们建设系统的高可用,高性能。

而且我们都知道redis是一个完全基于内存的工具,这也是redis速度快的一个原因,当我们往redis中不断缓存数据的时候,其内存总有满的时候(而且内存是很贵的东西,尽量省着点用),所以尽可能把有用的数据,或者使用频繁的数据缓存在redis中,物尽其用。

那么如果正在使用的redis内存用完了,我们应该怎么取舍redis中已存在的数据和即将要存入的数据呢,我们要怎么处理呢?

redis官方提供了8种不同的淘汰策略

redis.conf 是个好东西,几乎redis的所有配置都可以在这里找到,根据conf中的说明也就能操作了

我们看下redis.conf中关于8中淘汰策略的说明(本文使用redis版本是4.0.9)

volatile-lru -> Evict using approximated LRU among the keys with an expire set.
allkeys-lru -> Evict any key using approximated LRU.
volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
allkeys-lfu -> Evict any key using approximated LFU.
volatile-random -> Remove a random key among the ones with an expire set.
allkeys-random -> Remove a random key, any key.
volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
noeviction -> Don't evict anything, just return an error on write operations.

# LRU means Least Recently Used(最近最少使用的,时间)
# LFU means Least Frequently Used(最不经常使用的,次数)
# The default is:
maxmemory-policy noeviction

上文是从redis.conf中摘出来关于淘汰策略的8种配置以及设置说明,其中maxmemory-policy noeviction 代表了淘汰策略默认的是noeviction,我们可以根据自己的业务需求修改合适的策略。
英文看不懂的看下面的中文

8种淘汰策略

  • volatile-lru:在设置过期时间的数据中淘汰最少使用的数据。
  • allkeys-lru:在所有的数据中淘汰最少使用的数据。
  • volatile-lfu:在设置过期时间的数据中淘汰使用频率最低的数据。
  • allkeys-lfu:在所有的数据中淘汰使用使用频率最低的数据。
  • volatile-random:在设置过期时间的数据中淘汰任意随机数据。
  • allkeys-random:在所有的数据中随机淘汰数据。
  • volatile-ttl:在设置过期时间的数据中淘汰最早过期的数据。
  • noeviction:默认策略,不淘汰数据,新增或者修改数据会抛异常,但是读操作正常进行,不受影响

上面是内存不足的淘汰策略,还有一种是过期键的删除策略,两者是不同,不要搞混了

过期键的删除策略

  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  • 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

expires字典会保存所有设置了过期时间的key的过期时间数据,其中,
key是指向键空间中的某个键的指针,
value是该键的毫秒精度的UNIX时间戳表示的过期时间。
键空间是指该Redis集群中保存的所有键。

总结

Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。

到此这篇关于浅谈Redis中的内存淘汰策略和过期键删除策略的文章就介绍到这了,更多相关Redis内存淘汰和过期键删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • redis启动,停止,及端口占用处理方法

    redis启动,停止,及端口占用处理方法

    今天小编就为大家分享一篇redis启动,停止,及端口占用处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Redis Cluster集群主从切换的踩坑与填坑

    Redis Cluster集群主从切换的踩坑与填坑

    这篇文章主要介绍了Redis Cluster集群主从切换的踩坑与填坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Redis连接池监控(连接池是否已满)与优化方法

    Redis连接池监控(连接池是否已满)与优化方法

    本文详细讲解了如何在Linux系统中监控Redis连接池的使用情况,以及如何通过连接池参数配置、系统资源使用情况、Redis命令监控、外部监控工具等多种方法进行检测和优化,以确保系统在高并发场景下的性能和稳定性,讨论了连接池的概念、工作原理、参数配置,以及优化策略等内容
    2024-09-09
  • Redis哈希Hash键值对集合操作(查询增加修改)

    Redis哈希Hash键值对集合操作(查询增加修改)

    Redis中的Hash数据 是一个 键值对集合,本文主要介绍了Redis哈希Hash键值对集合操作(查询增加修改),具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 详解Redis单线程架构的优势与不足

    详解Redis单线程架构的优势与不足

    很多人都遇到过这么一道面试题:Redis是单线程还是多线程?这个问题既简单又复杂,说他简单是因为大多数人都知道Redis是单线程,说复杂是因为这个答案其实并不准确,本文就给大家讲讲Redis单线程架构的优势与不足,需要的朋友可以参考下
    2024-02-02
  • 一文教你学会Redis的事务

    一文教你学会Redis的事务

    Redis 作为内存的存储中间件,已经是面试的面试题必问之一了。今天小编就来和大家一起来聊聊Redis的事务吧,希望对大家有所帮助
    2022-08-08
  • 关于redis的延迟双删策略总结

    关于redis的延迟双删策略总结

    这篇文章主要介绍了关于redis的延迟双删策略总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • redis使用skiplist跳表的原因解析

    redis使用skiplist跳表的原因解析

    经常会有人问这个问题,redis中为什么要使用跳表?这个问题,redis作者已经给出过明确答案,今天通过本文再给大家讲解下这个问题,对redis skiplist跳表知识感兴趣的朋友一起看看吧
    2022-10-10
  • Redis sentinel哨兵集群的实现步骤

    Redis sentinel哨兵集群的实现步骤

    本文主要介绍了Redis sentinel哨兵集群的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 一步步教会你redis如何配置密码

    一步步教会你redis如何配置密码

    Redis的配置文件中可以设置密码来保护访问,下面这篇文章主要给大家介绍了关于redis如何配置密码的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01

最新评论