Redis的缓存过期淘汰策略

这篇具有很好参考价值的文章主要介绍了Redis的缓存过期淘汰策略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 面试题引入

  • 生产上你们redis内存设置多少?
  • 如何配置,修改redis的内存大小?
  • 如果内存满了怎么办?
  • redis清理内存的方式?定期删除和惰性删除了解过吗?
  • redis缓存淘汰策略有哪些?分别是什么?你用哪个?
  • redis的LRU了解过吗?请手写LRU。
  • LRU和LFU算法的区别是什么?

二 Redis内存满了怎么办?

2.1 redis默认内存多少?在哪里查看?如何设置修改?

  • 如何查看Redis最大占用内存Redis的缓存过期淘汰策略
    注意: maxmemory参数是bytes字节类型,注意转换

  • redis默认内存多少可以用?
    config get maxmemory :默认大小为0。
    如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存。注意:在64bit系统下,maxmemeory设置为0表示不限制Redis内存使用

  • 一般生产上你如何配置?
    一般推荐Redis设置内存为最大物理内存的四分之三。

  • 如何修改redis内存设置?

    • 通过修改配置文件Redis的缓存过期淘汰策略

    • 通过命令修改:config set maxmemory 104857600 注意:重启后失效

  • 怎么查看redis内存使用情况?

    • info memory
    • config get maxmemory

2.2 如果Redis内存使用超出了设置的最大值会怎样?

Redis的缓存过期淘汰策略

三 Redis里的数据怎么没的?它如何删除呢?

3.1 Redis过期键的删除策略

3.1.1 立即删除

Redis不可能时时刻刻遍历所有被设置了生存时间的key,来检测数据是否已经到了过期时间,然后对它进行删除。
立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对CPU是最不友好的。因为删除操作会占用CPU的时间,产生大量的性能消耗,同时也会影响数据的读取操作。
小总结: 对CPU不友好,用处理器性能换取存储空间(拿时间换空间)。

3.1.2 惰性删除

数据到达过期时间,不做处理。等下次访问该数据时:

  • 如果未过期,返回数据。
  • 如果已过期,删除,返回不存在。

惰性删除策略的缺点是:对内存是最不友好的
如果一个键已经过期,而这个键仍然保留在redis中,那么只要这个过期键不被删除,它所占用的内存就不会释放。在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远不会被删除(除非用户手动执行FLUSHDB),我们甚至可以将这种情况看做是一种内存泄漏–无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放它们,这对于运行状态非常依赖于内存的Redis服务器来说,肯定不是一个好消息。

小总结: 对memory不友好,用存储空间换取处理器性能(拿空间换时间)

开启惰性淘汰: lazyfree-lazy-eviction = yes

3.1.3 定期删除

定期删除策略是前两种策略的折中:
定期删除策略每隔一段时间执行一次删除过期键操作并通过限制删除操作执行时长和频率来减少删除操作对CPU时间的影响。

周期性轮询Redis库中的时效性数据,采用 随机抽取 的策略,利用过期数据占比的方式控制删除频度。
特定1:CPU性能占用设置有峰值,检测频度可自定义设置。
特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理。
总结: 周期性抽查存储空间(随机抽查,重点抽查)

定期删除策略的难点是确定删除操作执行的时长和频率:如果删除操作执行得太频繁或者执行的时间太长,定期删除策略就会退化成立即删除策略,以至于将CPU时间过多地消耗在删除过期键上面。如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率

3.1.4 上述策略的缺陷

  • 定期删除时,从来没有被抽查到的key
  • 惰性删除时,从来没有被点中使用过。

上述两种情况会导致大量过期的key堆积在内存中,导致Redis内存空间紧张或者很快耗尽。

四 Redis缓存淘汰策略

4.1 redis关于缓存淘汰策略的配置文件

Redis的缓存过期淘汰策略

4.2 lru与lfu的区别?

  • LRU means Least Recently Used
  • LFU means Least Frequently Used

区别:文章来源地址https://www.toymoban.com/news/detail-468459.html

  • LRU:最近最少使用页面置换算法,淘汰最长时间未被使用的页面,看页面最后一次被使用到发生调度的时间长短,首先淘汰最长时间未被使用的页面。
  • LFU:最近最不常用的页面置换算法,淘汰一定时期内被访问次数最少的页,看一定时间段内页面被使用的频率,淘汰一定时期内被访问次数最少的页。

4.3 Redis缓存淘汰策略

  • noeviction:不会驱逐任何key,表示即使内存达到上限也不进行置换,所有能引起内存增加的命令都会返回error。
  • allkeys-lru:对所有key使用LRU算法进行删除,优先删除掉最近最不经常使用的key,用以保存新数据。
  • volatile-lru:对所有设置了过期时间的key使用LRU算法进行删除
  • allkeys-random:对所有key随机删除
  • volatile-random:对所有设置了过期时间的key随机删除
  • volatile-ttl:删除马上要过期的key
  • allkeys-lfu:对所有key使用LFU算法进行删除
  • volatile-lfu:对所有设置了过期时间的key使用LFU算法进行删除

4.4 平时使用的淘汰策略

  • 在所有的key都是最近最经常使用,那么就需要选择allkeys-lru进行置换最近最不经常使用的key,如果你不确定使用哪种策略,那么推荐使用allkeys-lru
  • 如果所有的key的访问概率都是差不多的,那么可以选择allkeys-random策略去置换数据
  • 如果对数据有足够的了解,能够为key指定hint(通过expire/ttl指定),那么可以选择volatile-ttl进行置换。

4.5 淘汰策略的配置与修改

  • 直接使用config命令(重启失效)
  • redis.conf配置文件修改

五 redis缓存淘汰策略配置性能建议

  • 避免存储bigkey
  • 开启惰性淘汰,lazyfree-lazy-eviction=yes

到了这里,关于Redis的缓存过期淘汰策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis追本溯源(三)内核:线程模型、网络IO模型、过期策略与淘汰机制、持久化

    Redis在处理客户端请求时,通常使用单线程来进行读取、解析、执行和响应返回,因此被称为单线程应用。在4.0版本之前,这一描述是准确的。 单线程: 读取、解析、执行和响应返回。 从4.0版本开始,Redis开始使用后台线程来处理一些耗时的操作,如清理脏数据、释放超时连

    2024年02月15日
    浏览(35)
  • LRU算法与Caffeine、Redis中的缓存淘汰策略

    在现代计算机系统中,缓存是提高系统性能的关键技术之一。为了避免频繁的IO操作,常见的做法是将数据存储在内存中的缓存中,以便快速访问。然而,由于内存资源有限,缓存的大小是有限的,因此需要一种策略来淘汰缓存中的数据,以便为新的数据腾出空间。本文将介

    2024年02月12日
    浏览(28)
  • Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

    redis的过期策略可以通过配置文件进行配置 redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key。 1).每100ms从过期字典中 随机挑选20个,把其中过期的key删除; 2).如果过期的key占比超过1/4,重复步骤1 为了保证不会循环过度,导致卡顿,扫描时间上限

    2024年02月08日
    浏览(43)
  • Redis(概述、应用场景、线程模式、数据持久化、数据一致、事务、集群、哨兵、key过期策略、缓存穿透、击穿、雪崩)

    目录 Redis概述 应用场景 Redis的线程模式 数据持久化 1.Rdb(Redis DataBase) 2.Aof(Append Only File) mysql与redis保持数据一致 redis事务 主从复制(Redis集群) 哨兵模式 key过期策略 缓存穿透、击穿、雪崩 1.缓存穿透:缓存中没有,在mysql中也没有 2.缓存击穿:数据在数据库中存在,某个

    2024年01月16日
    浏览(47)
  • redis内存回收——过期、淘汰

    redis内存设置过大时会增加同步等操作的复杂度 惰性删除 访问时,检查过期时间,删除 已过期但不访问的数据,永远存在,占据内存 周期删除 定期抽样部分key检查过期时间,删除 SLOW redis初始化时设置定期任务 默认每秒执行10次,每个周期100ms 执行清理耗时不超过一次执行

    2023年04月11日
    浏览(24)
  • 缓存淘汰策略

    LRU 与 LFU 缓存策略及其实现。 鉴于磁盘和内存读写的差异性,DB 中低频写、高频读的数据适合放入内存中,直接供应用层读写。在项目中读取用户资料时就使用到了 LRU,而非放到 Redis 中。 缓存的 2 个基本实现 缓存的 2 个特征 命中率:即命中数 / 请求数,比值越高即表明缓

    2024年02月16日
    浏览(33)
  • cache教程1.LRU 缓存淘汰策略

    这一节实现LRU算法,要理解明白其使用的数据结构。 Cache的缓存全部存储在内存中,内存是有限的,因此不可能无限制地添加数据。当占用内存超过了给定的内存大小时候,就需要从缓存中移除一条或多条数据了。我们肯定希望尽可能移除“没用”的数据,那如何判定数据“

    2024年02月04日
    浏览(33)
  • LinkedHashMap如何实现LRU缓存淘汰策略?

    LRU,Least Recently Used, 最近最少使用 ,也就是优先淘汰最近最少使用的元素。 简而言之,就是将LinedHashMap的accessOrder设为true即可。 demo实现如下: 测试一下: 3.1 LinkedHashMap简介 LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用

    2023年04月24日
    浏览(29)
  • Redis中的淘汰策略

    本文主要说明在Redis面临key过期和内存不足的情况时,可以采用什么策略进行解决问题。 正如我们知道的Redis是基于内存的、单线程的一个中间件,在面对过期数据的时候,Redis并不会去直接把它从内存中进行剔除,因为Redis是单线程的,如果出现了过期key就立马去删除,可能

    2024年02月11日
    浏览(32)
  • Redis的内存淘汰策略

    Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。 noeviction :当内存不足以容纳新写入数据时,新写入操作会报错。 allkeys-lru :当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用

    2024年02月10日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包