首页 > 试题广场 >

说说Redis的缓存淘汰策略。

[问答题]
惰性删除:客户端访问一个key的时候,redis先检查它的过期时间,如果已经过期了就立刻删除这个key 定期删除:redis会将设置了过期时间的key保存到一个字典里面,然后每过十秒就扫描一次。这个定期删除也不扫描字典中所有的key,而是采用了一种简单的弹性策略。 定期删除对内存更加友好,而惰性删除对CPU更加友好,所以redis采用的是定期删除+惰性/懒汉式删除。
发表于 2022-06-10 22:04:43 回复(2)
惰性删除: 当你访问一个key的时候,redis检查它的过期时间,如果过期就会删除。 定期删除:redis会将设置了过期事件的key全都放入一个字典中,然后进行扫描,过期了的key就会被删除。但是扫描不是全局扫描,而是一种简单的贪心算法,从字典中随机选择20个key,将过期的key删除,当过期的key超过一定的比例时,将会再次随机选择,知道随机选择的key小于一定比例。 当写入数据超过最大内存限制时,redis也有8种淘汰方案: 1. 直接报错 2. 删除拥有过期时间的key中快要过期的 3. 在所有key中随机删除 4. 在具有过期时间的key中随机删除 5. lru 从所有key中删除使用时间离现在最久的 6. lru 从拥有过期时间的key中删除使用时间离现在最久的 7. lfu 从所有key中删除使用次数最少的 8. lfu 从拥有过期时间的key中删除使用次数最少的
编辑于 2022-07-15 15:05:41 回复(0)
惰性删除、定期删除、maxmemory-policy;惰性删除:客户端访问一个key的时候,Redis会先检查它的过期时间,如果发现过期就立刻删除这个key。定期删除:redis会将设置了过期时间的key放到一个独立的字典中,并对该字典进行每秒10次的过期扫描,过期扫描不会遍历字典中所有的key,而是采用了一种简单的贪心策略,该策略如下:1、从过期字典红随机选择20个key,2、删除这20个key中已过期的key,3、如果已过期key的比例超过25%,则重复步骤1;当写入数据将超出maxmemory限制时,Redis会采用maxmemory-policy所制定的策略进行数据淘汰 即 LRU (最近最少使用原则)LRU算法的不足之处在于,若一个key很少被访问,只是刚刚偶尔被访问了一次,则它就被认为是热点数据,短时间内不会被淘汰。 LFU算法正式用于解决上述问题,LFU(Least Frequently Used)是Redis4新增的淘汰策略,它根据key的最近访问频率进行淘汰。LFU在LRU的基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。当使用LFU策略淘汰数据时,首先会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出内存。如果两个数据的访问次数相同,LFU再比较这两个数据的访问时间,把访问时间更早的数据淘汰出内存。
发表于 2022-05-08 13:30:45 回复(1)
懒惰删除:客户端访问一个key时,redis会先检查它的过期时间如果发现过期即删除 定期删除:redis会将设置过期时间的key保存在一个字典中软化每隔一定时间扫描一次
发表于 2022-06-21 13:36:58 回复(0)
Redis有两种缓存淘汰策略,分别是惰性删除和定期删除。 惰性删除:客户端访问一个key的时候,Redis会先检查它的过期时间,如果发现过期就立刻删除这个key。 定期删除:Redis会将设置了过期时间的key放到一个独立的字典中,并对该字典进行每秒10次的过期扫描,过期扫描不会变量字典中所有的key,而是采用了一种简单的贪心策略,该策略如下:1)从过期字典中随机选择20个key。2)删除这20个key中已过期的key。3)如果已过期key的比列超过25%,则重复步骤1。当写入数据将超出maxmemory限制时,Redis会采用maxmemory-policy所指定的策略进行数据淘汰,即LRU(最近最少使用原则),不足之处在于,若一个key很少被访问,知识刚刚偶尔被访问了一次,则它就被认为是热点数据,短时间内不会被淘汰。LFU(Least Frequently Used)可以解决上诉问题,它根据key的最近访问频率进行淘汰。LFU在LRU的基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。当使用LFU策略淘汰数据时,首先会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出内存。如果两个数据的访问次数相同,LFU再比较这两个数据的访问时间,把访问时间更早的数据淘汰出内存。
发表于 2022-07-23 13:55:24 回复(1)
惰性删除、定期删除、maxmemory

1.每次访问时检测是否过期,过期删除

2.到时间随机挑20个key判断过期时间,删除

3.超过缓存大小,就采用类似lru算法进行淘汰(改进为lfu算法)。

编辑于 2022-07-05 14:47:47 回复(0)
当redis内存占用过高时,删除一部key,来保证redis内存占用率不会太高。 主要分为volatile对设置了过期时间的key进行操作与allkeys对所有key进行操作。 volatile包括LRU:删除最近最少使用的key;LFU:删除使用频率是最少的key;random:随机删除;ttl:对将要过期的key进行删除。 allkeys也同样包括:LRU、LFU与random
发表于 2022-07-18 21:39:38 回复(0)
Redis的缓存淘汰策略有三种类型,不淘汰,根据过期时间淘汰,对所有键淘汰。不淘汰这种策略在内存满了的时候会直接报错,不再接收数据。根据过期时间淘汰从设置了过期时间的key选择数据进行淘汰,主要有lru,lfu,ttl三种淘汰算法,lru算法淘汰最近最少使用的键,lfu淘汰使用最少的键,ttl淘汰最先过期的键。从所有键淘汰也有lru,lfu。
发表于 2025-06-26 14:58:15 回复(0)
1.惰性删除:当你访问一个key的时候,redis检查它的过期时间,如果过期就会删除。

2.定期删除:redis会将设置了过期事件的key全都放入一个字典中,然后进行扫描,过期了的key就会被删除。但是扫描不是全局扫描,而是一种简单的贪心算法,从字典中随机选择20个key,将过期的key删除,当过期的key超过一定的比例时,将会再次随机选择,知道随机选择的key小于一定比例。

3.超过缓存大小,就采用类似lru算法进行淘汰(改进为lfu算法)。
当写入数据超过最大内存限制时,redis也有8种淘汰方案:
1. 直接报错
2. 删除拥有过期时间的key中快要过期的
3. 在所有key中随机删除
4. 在具有过期时间的key中随机删除
5. lru 从所有key中删除使用时间离现在最久的
6. lru 从拥有过期时间的key中删除使用时间离现在最久的
7. lfu 从所有key中删除使用次数最少的
8. lfu 从拥有过期时间的key中删除使用次数最少的
编辑于 2023-02-25 13:55:17 回复(0)
redis三种过期key的删除策略。1、惰性删除:key到达过期时间时,不做处理。等到下次访问时判断,如果过期则删除key,未过期则返回数据。2、定期删除:redis会将设置了过期时间的key放到一个独立的字典中,并对该字典进行每秒10次的过期扫描,过期扫描不会遍历字典中所有的key,而是采用了一种简单的贪心策略,该策略如下:(1)、从过期字典红随机选择20个key,(2)、删除这20个key中已过期的key,(3)、如果已过期key的比例超过25%,则重复步骤(1)。3、写入数据将导致超出maxmemory限制时,Redis会采用maxmemory-policy所制定的策略进行数据淘汰 即 LRU (最近最少使用原则)LRU算法的不足之处在于,若一个key很少被访问,只是刚刚偶尔被访问了一次,则它就被认为是热点数据,短时间内不会被淘汰。 LFU算法正式用于解决上述问题,LFU(最少使用),它根据key的最近访问频率进行淘汰。LFU在LRU的基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。当使用LFU策略淘汰数据时,首先会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出内存。如果两个数据的访问次数相同,LFU再比较这两个数据的访问时间,把访问时间更早的数据淘汰出内存。
编辑于 2023-04-04 00:27:06 回复(0)
一共分为两种,1.惰性删除:Redis会先检查它的过期时间,如果过期就直接删除 例如allkeys_lru:删除最近最少使用的key allkeys_lfu:删除最少使用的key allkeys_ramdon:随机删除key 2.定期删除:从设置了过期时间的key中删除过期的key 例如:volatile_lru volatile_lfu volatile_ramdon volatile_ttl 还有默认的noviction:内存不足就会报错
发表于 2023-02-09 15:55:40 回复(0)
惰性清除:只有当访问这个key的时候才判断是否过期,如果过期就清除,对CPU友好但是对内存不友好;定时清除:为每个key设置一个定时器,只要时间到了就删除,对内存友好但是会耗费大量的CPU资源;定期清除:每隔一定的时间扫描数据库中一定数量的key,清除其中已经过期的key。
发表于 2022-09-09 21:47:14 回复(1)
maxmemory-policy淘汰策略(默认:maxmemory-policy noeviction)   当 Redis 内存使用达到 maxmemory 时,需要选择设置好的 maxmemory-policy 进行对数据进行淘汰机制。 1.volatile-lru(least recently used):最近最少使用算法,从设置了过期时间的键key中选择空转时间最长的键值对清除掉; 2.volatile-lfu(least frequently used):最近最不经常使用算法,从设置了过期时间的键中选择某段时间之内使用频次最小的键值对清除掉; 3.volatile-ttl:从设置了过期时间的键中选择过期时间最早的键值对清除; 4.volatile-random:从设置了过期时间的键中,随机选择键进行清除; 5.allkeys-lru:最近最少使用算法,从所有的键中选择空转时间最长的键值对清除; 6.allkeys-lfu:最近最不经常使用算法,从所有的键中选择某段时间之内使用频次最少的键值对清除; 7.allkeys-random:所有的键中,随机选择键进行删除; 8.noeviction:不做任何的清理工作,在redis的内存超过限制之后,所有的写入操作都会返回错误;但是读操作都能正常的进行;
发表于 2022-09-05 15:46:37 回复(0)
Redis淘汰策略有键范围和淘汰算法两个维度。范围有:过期键和全部键,算法有:淘汰最久未使用的LRU,淘汰最低频率的LFU,淘汰剩余时间最短的LTT。volidate-LRU是淘汰最久未使用的过期键;vloidate-LFU是淘汰使用频率最低的过期键;volidate-TTL是淘汰剩余时间最短的过期键;volidate-random是随机淘汰过期键;allkeys-random是最简单快速的算法,淘汰随机的键;allkeys-LRU是淘汰最久未使用的键,是推荐算法;allkeys-LFU是淘汰使用频率最低的键(热点数据缓存)
发表于 2025-12-31 15:58:18 回复(0)
Redis有两种缓存淘汰策略,分别是惰性删除和定期删除。 惰性删除:客户端访问一个key的时候,Redis会先检查它的过期时间,如果发现过期就立刻删除这个key。 定期删除:Redis会将设置了过期时间的key放到一个独立的字典中,并对该字典进行每秒10次的过期扫描,过期扫描不会变量字典中所有的key,而是采用了一种简单的贪心策略,该策略如下:1)从过期字典中随机选择20个key。2)删除这20个key中已过期的key。3)如果已过期key的比列超过25%,则重复步骤1。当写入数据将超出maxmemory限制时,Redis会采用maxmemory-policy所指定的策略进行数据淘汰,即LRU(最近最少使用原则),不足之处在于,若一个key很少被访问,知识刚刚偶尔被访问了一次,则它就被认为是热点数据,短时间内不会被淘汰。LFU(Least Frequently Used)可以解决上诉问题,它根据key的最近访问频率进行淘汰。LFU在LRU的基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。当使用LFU策略淘汰数据时,首先会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出内存。如果两个数据的访问次数相同,LFU再比较这两个数据的访问时间,把访问时间更早的数据淘汰出内存。
发表于 2025-11-12 22:01:17 回复(0)
redis默认采取的策略是不清理,内存满了,可读不可写。redis的清理分为惰性清理和定时清理,惰性清理是访问到这个键检查是否过期,若过期就清理。定时清理为了降低对cpu的占用率会先随机选20个,不是维护整个键值对列表,,若过期比例超过25%会自动清理并继续执行,直到比例小于25%。对于需要处理冷热数据的要用lru算法,不需要的就是直接random随机清除。
发表于 2025-10-03 10:57:46 回复(0)
redis的内存淘汰策略:当redis内存满的时候, 通过淘汰一些key得到空闲的内存空间,主要有5大类:
1.noeviction(不淘汰,默认策略):内存满的时候新写入直接报错
2.LRU(淘汰最近最少使用的数据):细分为allkeys lru(在所有键中淘汰最近最少使用的数据)和volatile lru(在添加ttl的键中淘汰最近最少使用的数据)
3.LFU(淘汰最近使用频率最低的数据):细分为allkeys lfu(在所有键中淘汰最近使用频率最低的数据)和volatile lfu(在添加ttl的键中淘汰最近使用频率最低的数据)
4.TTL(淘汰即将过期的数据):在添加ttl的键中淘汰即将过期的数据
5.RANDOM(随机淘汰一批数据):分为allkeys random(在所有键中随机淘汰一批数据)和volatile random(在添加ttl的键中随机淘汰一批数据)

redis是如何删除过期key的?
1.惰性删除:客户端访问key时先校验key是否过期,过期直接删除
2.定时删除:redis维护一个添加ttl的key字典,定期扫描这个字典,每次扫描不是全表扫描,随机取一批数据去判断是否过期,过期就删除

发表于 2025-08-05 15:23:13 回复(0)
惰性删除和定时删除。惰性删除时在访问一个key时,redis会检查他的过期时间,过期删除。定时删除时指将设置了过期时间的key保存在字典中,定时扫描字典,过期了的key就会删除,但是扫描也不是全局扫描,而是利用贪心算法,从字典中随机抽取20个key,过期的key删除,当这20个key中需要删除的比例超过一定比例时,将会再次随机选择,直到过期的比例小于一定比例。当写入的key超过最大内存限制时,也有8中内存淘汰策略:1.直接报错;2.删除有过期时间的key中快要过期的;3.在所有key中随机删除;4.在有过期时间中的key中随机删除;5.从所有key中删除使用时间离现在最久的;6.从所有key中删除使用次数最少的;8.从设置了过期时间的key中删除使用次数最少的。
发表于 2025-07-06 23:20:17 回复(0)
Redis提供多种缓存淘汰策略,包括:volatile-lru(针对过期键的LRU淘汰)、allkeys-lru(全体键LRU)、volatile-lfu(过期键LFU)、allkeys-lfu(全体键LFU)、volatile-ttl(优先淘汰剩余时间短的键)、volatile-random/ allkeys-random(随机淘汰),以及默认的noeviction(禁止写入)。策略根据内存上限自动触发,用于管理内存不足时的数据清理。
发表于 2025-06-06 16:57:50 回复(0)
redis的删除策略主要有惰性删除,定期删除,maxmemory-policy。 惰性删除:redis不会主动删除过期的key,当访问key时,检查其是否过期,如果过期将其删除。 定期删除:按照设定时间进行扫描,删除过期的key。具体操作:1.每10秒选取20个key,检查其过期时间,如果超过25%的key过期,则继续选取并扫描淘汰。 maxmemory-policy:当数据量达到设定的maxmemory时,会进行扫描,通过lru选取淘汰,但是由于redis中的lru算法是近似算法,并不能完全代表热点数据,如果恰好在扫描前进行了一次方位,就会被认定为热点数据,所以redis增加了一个计数器代表访问次数,在淘汰时,先选择访问次数小的,如果访问次数相同,则通过lru进行淘汰。
发表于 2025-06-02 11:07:10 回复(0)