Redis之内存淘汰与键过期删除策略

键过期删除策略

Redis的键可以设置过期时间,时间一到,就会自动删除。但是我们会不会这么一种情景发生:会不会因为有这么同一时刻太多的key过期,以至于忙不过来。同时因为 Redis 是单线程的,收割的时间也会占用线程的处理时间,如果收割的太过于繁忙,会不会导致线上读写指令出现卡顿?

其实关于这个键过期删除我们也是有策略的,所以并不会导致这个情况发生。

定时删除(主动删除策略)

通过使用定时器(时间事件,采用无序链表实现,),定时删除数据。定时删除策略可以保证过期的键会尽可能快的被删除了,并释放过期键锁占用的内存。

优点:对内存是友好的,通过使用定时器,定时删除策略可以保证过期键会尽可能快地被删除,并释放过期键锁占用地内存。

缺点:对CPU时间是最不友好地:在过期键比较多的情况下,删除过期键这一行为会占用相当一部分CPU时间,在内存不紧张但是CPU非常紧张的情况下,将CPU应用于删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响。

惰性删除(被动删除策略)

程序在每次使用到键的时候去检查是否过期,如果过期则删除并返回空。

优点:对CPU时间是最友好的,程序只会在取出键的时候才对键进行过期检查,所以不会在删除其他无关的过期键上花费任何CPU时间。

缺点:对内存是不友好的,如果一个键已经过期,而又保留在数据库中,只要这个过期键没有被删除,那么它所占有的内存就永远不会释放。而我们如果永远没有访问到这些键的话,那么这些内存就永远不会被释放,我们可以把这看成是一种内存泄漏

定期删除(主动删除策略)

可以看成是两种策略的整合和折中

我们可以发现不管是定时删除还是惰性删除,这两种策略都有明显的缺陷

  • 定时删除占用太多的CPU时间,影响服务器的响应时间和吞吐量
  • 惰性删除浪费太多内存,有内存泄漏的危险

所以通过使用定期删除策略我们可以比较好的解决这些问题

优点:

  • 每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少操作对CPU时间的影响(这里我们用到是定时扫描策略)
  • 定期删除过期键,有效地减少了因为过期键带来的内存浪费

缺点:

  • 如果删除操作执行得太频繁,或者执行得时间太长,定期删除策略就会退化成定时策略,以至于将CPU时间过多地消耗在删除键上面。
  • 如果删除操作执行的过少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现内存浪费的情况。

总结:如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。

定时扫描策略

上面我们定期删除优点第一点提到了这个策略。Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。

  1. 从过期字典中随机 20 个 key;

  2. 删除这 20 个 key 中已经过期的 key;

  3. 如果过期的 key 比率超过 1/4,那就重复步骤 1;

同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

内存淘汰策略

​ 当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。
​ 在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。
​ 当实际内存超出 maxmemory 时,Redis 提供了几种可选策略 (maxmemory-policy) 来让用户自己决定该如何腾出新的空间以继续提供读写服务。

关于内存淘汰策略有以下六种:

(1)noeviction 不会继续服务写请求 (DEL 请求可以继续服务),读请求可以继续进行。也就是当内存不足以容纳新入数据时,新写入操作就会报错。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。

应用场景:目前默认使用的就是。

(2)volatile-lru 尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。

应用场景:如果希望一些数据能长期被保存,而一些数据可以被淘汰掉时

(3)volatile-ttl 跟上面一样,除了淘汰的策略不是 LRU,而是 key 的剩余寿命 ttl 的值,ttl
越小越优先被淘汰。

应用场景:如果研发者需要通过设置不同的ttl来判断数据过期的先后顺序,此时可以选择volatile-ttl策略。

(4)volatile-random 跟上面一样,不过淘汰的 key 是过期 key 集合中随机的 key。

应用场景:如果希望一些数据能长期被保存,而一些数据可以被淘汰掉时。

(5)allkeys-lru 区别于 volatile-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合。这意味着没有设置过期时间的 key 也会被淘汰。

应用场景:

  • 在Redis中,数据有一部分访问频率较高,其余部分访问频率较低,或者无法预测数据的使用频率时,设置allkeys-lru是比较合适的。
  • 由于设置expire会消耗额外的内存,如果计划避免Redis内存在此项上的浪费,可以选用allkeys-lru 策略,这样就可以不再设置过期时间,高效利用内存了。

(6)allkeys-random 跟上面一样,不过淘汰的策略是随机的 key。

应用场景: 如果所有数据访问概率大致相等时,可以选择allkeys-random。

参考资料

《Redis设计与实现》

《Redis深度历险:核心原理与应用实践》

Redis内存淘汰策略,看这一篇就够了!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350