Redis内存淘汰机制及过期Key处理

Stella981
• 阅读 564

  “天长地久有时尽,此恨绵绵无绝期。”好诗!好诗啊!即使是天长地久,也总会有尽头,那么,Redis的内存是不是也会有时尽呢?答案是肯定的。那么,当Redis的内存满了以后,再来新的请求,我们该怎么办呢?这时候,大家就应该来了解Redis的内存淘汰策略了,了解了相关的知识点后,就能明白“Redis内存有时尽”后,会发生些什么。

Redis内存淘汰机制

  Redis内存淘汰机制是指当内存使用达到上限(可通过maxmemory配置,0为不限制,即服务器内存上限),根据一定的算法来决定淘汰掉哪些数据,以保证新数据的存入。

  常见的内存淘汰机制分为四大类:

  1. LRU:LRU是Least recently used,最近最少使用的意思,简单的理解就是从数据库中删除最近最少访问的数据,该算法认为,你长期不用的数据,那么被再次访问的概率也就很小了,淘汰的数据为最长时间没有被使用,仅与时间相关。

  2. LFU:LFU是Least Frequently Used,最不经常使用的意思,简单的理解就是淘汰一段时间内,使用次数最少的数据,这个与频次和时间相关。

  3. TTL:Redis中,有的数据是设置了过期时间的,而设置了过期时间的这部分数据,就是该算法要解决的对象。如果你快过期了,不好意思,我内存现在不够了,反正你也要退休了,提前送你一程,把你干掉吧。

  4. 随机淘汰:生死有命,富贵在天,是否被干掉,全凭天意了。

  通过maxmemroy-policy可以配置具体的淘汰机制,看了网上很多文章说只有6种,其实有8种,可以看Redis5.0的配置文件,上面有说明:

  1. volatile-lru -> 找出已经设置过期时间的数据集,将最近最少使用(被访问到)的数据干掉。
  2. volatile-ttl -> 找出已经设置过期时间的数据集,将即将过期的数据干掉。
  3. volatile-random -> 找出已经设置过期时间的数据集,进行无差别攻击,随机干掉数据。
  4. volatile-lfu -> 找出已经设置过期时间的数据集,将一段时间内,使用次数最少的数据干掉。

  5. allkeys-lru ->与第1个差不多,数据集从设置过期时间数据变为全体数据。
  6. allkeys-lfu -> 与第4个差不多,数据集从设置过期时间数据变为全体数据。
  7. allkeys-random -> 与第3个差不多,数据集从设置过期时间数据变为全体数据。

  8. no-enviction -> 什么都不干,报错,告诉你内存不足,这样的好处是可以保证数据不丢失,这也是系统默认的淘汰策略。

Redis过期Key清除策略

  Redis中大家会对存入的数据设置过期时间,那么这些数据如果过期了,Redis是怎么样把他们消灭掉的呢?我们一起来探讨一下。下面介绍三种清除策略:

  惰性删除:当访问Key时,才去判断它是否过期,如果过期,直接干掉。这种方式对CPU很友好,但是一个key如果长期不用,一直存在内存里,会造成内存浪费。

  定时删除:设置键的过期时间的同时,创建一个定时器,当到达过期时间点,立即执行对Key的删除操作,这种方式最不友好。

  定期删除:隔一段时间,对数据进行一次检查,删除里面的过期Key,至于要删除多少过期Key,检查多少数据,则由算法决定。举个例子方便大家理解:Redis每秒随机取100个数据进行过期检查,删除检查数据中所有已经过期的Key,如果过期的Key占比大于总数的25%,也就是超过25个,再重复上述检查操作。

  Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,可以很好地在合理使用CPU和避免浪费内存之间取得平衡。

  好的,相关知识介绍完毕,希望这篇文章能对你有所帮助!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Redis的分片机制包含对一致性HASH算法的运用
前言:大家都知道redis单台的默认内存大小一般是10M.如果现在需要我们将1G的数据保存到内存中。这该如何做到呢?比如我们就用单台redis,但是一味的扩大单台redis内存则直接影响执行的效率,会有一种得不偿失的感觉。于是呢,我们就得采用分片策略实现数据保存,通过多台redis共同为用户提供内存得支持,实现内存扩容,提高执行效率!!
Stella981 Stella981
3年前
Redis 知识整理
_本文以Redis5.0.7为准。_基本概念Redis是开源的(BSD协议)内存数据存储。以KV的方式存储数据。key类型固定为string,value支持的类型有:stringlistsetzsethashtable淘汰策略volat
Stella981 Stella981
3年前
Redis 总结精讲
本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题
Stella981 Stella981
3年前
Redis内存淘汰机制
摘要Redis是一款优秀的、开源的内存数据库,我在阅读Redis源码实现的过程中,时时刻刻能感受到Redis作者为更好地使用内存而费尽各种心思,例如最明显的是对于同一种数据结构在不同应用场景下提供了基于不同底层编码的实现(如压缩列表、跳跃表等)。今天我们暂时放下对Redis不同数据结构的探讨,来一起看看Redis提供的另一种机制——内存淘汰机制。
Stella981 Stella981
3年前
Redis专题(2):Redis数据结构底层探秘
前言上篇文章Redis闲谈(1):构建知识图谱(https://my.oschina.net/u/4007037/blog/3045328)介绍了redis的基本概念、优缺点以及它的内存淘汰机制,相信大家对redis有了初步的认识。互联网的很多应用场景都有着Redis的身影,它能做的事情远远超出了我们的想像。Redis的底层数据结构到底是什么
Stella981 Stella981
3年前
Redis从入门到放弃系列(七) 过期、内存淘汰策略
Redis从入门到放弃系列(七)过期、内存淘汰策略本文例子基于:5.0.4过期策略Redis对于设置了过期时间的key的过期策略有两种惰性删除定时随机删除惰性删除惰性删除的时机在于当你要获取该key的时候再去做判断.这里我以String类型
Stella981 Stella981
3年前
Redis 内存管理策略
背景Redis很多时候都是在使用内存,数据一直写,但内存是有限的,如果Redis内存满了,那么我们的很多缓存操作都会超时、失败,接着可能会引发雪崩。那么当内存达到阀值Redis是怎么处理的呢?配置内存限制maxmemory我们可以通过在配置文件中配置maxmemory来限制内存的最大使用情况。如果maxmem
Stella981 Stella981
3年前
Redis 淘汰策略解读
摘要:   Redis在生产环境中,采用配置参数maxmemory的方式来限制内存的大小。当实际存储内存超过maxmemory参数值时,开发者可以通过Redis内存淘汰策略,来决定如何腾出新空间继续支持读写工作。工作情况    首先,客户端会发起需要更多内存的申请;其次,Redis检查内存使用情况,如果