ChatGPT给出的回答:
Redis中的Key超时策略和Key淘汰机制是为了有效管理内存和控制数据的生命周期。
-
Key超时策略:Redis可以为每个Key设置过期时间,一旦Key过期,它将自动从Redis中删除。可以使用
EXPIRE
命令为Key设置过期时间,例如可以使用EXPIRE key seconds
命令设置某个Key在指定的秒数后过期。超时策略可以用于缓存失效、会话管理等场景,使得Redis可以自动清理不再使用的数据,释放内存空间。 -
Key淘汰机制:当Redis的内存达到一定限制时,需要使用淘汰机制来决定哪些Key应该被删除以释放内存。Redis提供了不同的Key淘汰策略:
- LRU(Least Recently Used):最近最少使用的Key被优先淘汰。
- LFU(Least Frequently Used):最不经常使用的Key被优先淘汰。
- Random(随机):随机选择Key进行淘汰。
- TTL(Time to Live):优先淘汰设置了过期时间且已过期的Key。
.
淘汰机制可以通过配置参数来设置,例如可以使用
maxmemory
参数来限制Redis使用的最大内存,使用maxmemory-policy
参数来指定淘汰策略。通过合理设置超时策略和淘汰机制,可以在Redis中有效管理内存,控制存储的数据,确保系统的性能和可用性。
详解
Redis过期策略
- Redis在设置缓存数据时设置了过期时间,到了过期时间数据就失效了,但数据不会自动删除,那Redis是怎么处理这些失效的数据的呢?这个处理逻辑称之为过期策略。
- Redis使用是惰性删除和定期删除两种策略。
Redis的key过期策略
- 被动方式 - 惰性删除
- 主动方式 - 定期删除
- 定时删除(十分消耗CPU资源,所以不用)
惰性删除
惰性删除不是去主动删除,而是在你要获取某个key 的时候,redis会先去检测一下这个key是否已经过期,如果没有过期则返回给你,如果已经过期了,则删除,返回null。
定期删除
-
Redis 默认每秒进行 10 次过期扫描,而是采用了一种简单的贪心策略:
-
他会去遍历16个库,遍历每一个库,对这个库进行抽样,抽样之后,判断抽样出来的key,是否超过1/4的key是否处于过期状态,如果说,这些抽样出来的key里边的没有超过1/4的key过期,此时他先清理完抽样出来过期的数据之后,再去遍历下一个库
-
如果说超过了1/4 的key过期了,再次去遍历这个库,再去取判断抽取出来是否超过1/4过期,如此循环。有一些默认的参数,规定说,遍历一个库的时间,最多不能超过多少,遍历所有库的时间最多不能超过多少。定期删除里面的参数都是算法决定的,参数可自己设置。
定时删除
在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
Redis淘汰机制
是指Redis的内存占用过多,达到maxmemory 之后,Redis就会采用一定的策略,淘汰掉一部分数据。
Redis6种淘汰机制
1、noeviction:当内存不足以容纳新写入数据时,新写入操作会报错(一般没人用,但是默认是使用这个策略)
2、allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(最常用)
3、allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key (一般没人用)
4、volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(一般不太合适)
5、volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个
6、key volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除