【你问我答】说说Redis过期淘汰策略

问题描述:

说说Redis过期淘汰策略

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#面试题目##Java##Java工程师##悬赏#
全部评论
过期策略   我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效。   如果假设你设置一个一批key只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的?   答案是:定期删除+惰性删除   所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。   注意,这里可不是每隔100ms就遍历所有的设置过期时间的key,那样就是一场性能上的灾难。   实际上redis是每隔100ms随机抽取一些key来检查和删除的。   但是,定期删除可能会导致很多过期key到了时间并没有被删除掉,所以就得靠惰性删除了。   这就是说,在你获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。   并不是key到时间就被删除掉,而是你查询这个key的时候,redis再懒惰的检查一下   通过上述两种手段结合起来,保证过期的key一定会***掉。   但是实际上这还是有问题的,如果定期删除漏掉了很多过期key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?   如果大量过期key堆积在内存里,导致redis内存块耗尽了,怎么办?   答案是:走内存淘汰机制。 内存淘汰机制   如果redis的内存占用过多的时候,此时会进行内存淘汰,有如下一些策略:   noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧   allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)   allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧   volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)   volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key   volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除
1 回复
分享
发布于 2020-05-06 17:03
可以设置内存最大使用量,当内存使用量超出时,会施行数据淘汰策略。 Redis 具体有 6 种淘汰策略: volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集中任意选择数据淘汰 allkeys-lru:从所有数据集中挑选最近最少使用的数据淘汰 allkeys-random:从所有数据集中任意选择数据进行淘汰 noeviction:禁止驱逐数据 Redis过期键淘汰策略: 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即对键的删除操作。 优点:通过使用定时器,定时删除策略可以保证过期键会尽可能快地被删除,并释放过期键所占用的内存。 缺点:对CPU时间不友好:在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间。 除此之外,创建一个定时器需要用到Redis服务器中的时间时间,而当前时间事件的实现方式--无序链表,查找一个事件的时间复杂度为O(N)--并不能高效地处理大量时间事件。 惰性删除:放任键过期不管,但是每次从键空间获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。 优点:对CPU时间来说是最友好的:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键。 缺点:对内存最不友好:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放。 比如:日志,在某个时间点之后,对它们的访问就会大大减少,甚至不再访问,如果这类过期数据大量地积压在数据库中,用户以为服务器已经自动将它们删除了,但实际上这些键仍然存在,而且键所占用的内存也没有释放,那么造成的后果肯定是非常严重的。 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。 优点:通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费。 难点:确定删除操作执行的时长和频率。
点赞 回复
分享
发布于 2020-05-07 21:05
联想
校招火热招聘中
官网直投

相关推荐

点赞 3 评论
分享
牛客网
牛客企业服务