
正文
redis过期键进行删除,redis如何处理过期数据
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Redis过期删除策略和内存淘汰策略
Redis可以用使用 expire 指令设置过期时间,在Redis内部,每当我们设置一个键的过期时间时,Redis就会将该键带上过期时间存放到一个过期字典中。当我们查询一个键时,Redis便首先检查该键是否存在过期字典中,如果存在,那就获取其过期时间。然后将过期时间和当前系统时间进行比对,比系统时间大,那就没有过期;反之判定该键过期。
那对于过期数据,一般有三种方式进行处理:
Redis的过期删除策略: 惰性删除 和 定期删除 两种策略配合使用。
spring-boot-starter-data-redis 包中提供了监听过期的类,对于key过期,需要得到通知,做业务处理的,可以做此监听。
springboot整合Redis参考, SpringBoot整合Redis - (jianshu.com)
在整合Redis的基础上,在新加监听配置
监听配置类
监听类
将Redis用作缓存时,如果内存空间用满,就会自动驱逐老的数据。
Redis中有6种淘汰策略:
redis.conf 文件中配置策略,有2个地方:
相关问答
Q1: Redis过期键删除策略及原理
通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度对库中的键设置生存时间(Time To Live,TTL)
SETNX可以在设置一个字符串键的同时设置过期时间。
TTL/ PTTL key 返回当前键的剩余时间
这也就是常用的,分布式锁的基本实现方式。
首先是明确:过期时间,存储在redisDB结构的expires字典里。这个字典称之为过期字典。
字典的键是一个指针,指向键空间里的某个键对象。
字典的值是一个long的整数,保存过期时间的毫米级unix时间戳。
Q2: Redis 配置过期自动删除策略
Redis操作是基于内存的,大小有限。当内存不足或占用过高时,需要自动放弃一些未到期的数据
Redis 默认 的生效的配置为 noeviction ,需要根据不同的业务选择不同的淘汰策略
volatile-lru:在设置过期时间的数据集合里淘汰最近访问最少的数据
allkeys-lru:所有数据集合中淘汰最近访问最少的数据
volatile-lfu:在设置过期时间的数据集合里淘汰访问频率最低的数据
allkeys-lfu:所有数据集合中淘汰访问频率最低的数据
volatile-random:在设置过期时间的数据集合里,随机淘汰
allkeys-random:在所有的数据集合随机淘汰
volatile-ttl:在设置过期时间的数据集合里,淘汰剩余存活时间 (TTL) 最少的数据
noevictionl:当内存不足以写入新数据时,拒绝新数据写入。Redis 默认策略
我这里越久的数据价值越低,不在乎调用次数。所以选择
volatile-ttl
找到配置 maxmemory-policy 默认被注释 生效策略 noevictionl
保存
重启redis 生效
Q3: Redis过期键删除策略和内存淘汰策略
惰性删除+定期删除
键过期后并不会立即删除,而是等到使用它时,先判断该键是否已经过期,如果过期则删除
对内存不友好,对CPU友好
redis每隔一段时间随机检测一部分数据(并不是全部)是否过期,如果已过期则删除
redis.conf中的hz参数用来配置每秒执行几次定期删除,默认值是10,即100ms/次
redis.conf中的maxmemory-samples参数用来指定每次检测几条数据,默认5
对CPU不友好,对内存友好
redis.conf中的maxmemory参数配置了redis的最大内存,maxmemory-policy配置了内存淘汰策略,当redis内存达到最大后,会根据内存淘汰策略淘汰部分数据。
redis提供了8种内存淘汰策略:
no-eviction:当内存达到最大后,新数据不能写入,会报错
allkeys-lru:当内存达到最大后,淘汰最近最少使用的数据(最常用的策略)
allkeys-random:当内存达到最大后,随机淘汰
allkeys-lfu:当内存达到最大后,淘汰最少使用的数据
volatitle-lru:当内存达到最大后,从设置了过期键的数据中,淘汰最近最少使用的数据
volatitle-random:当内存达到最大后,从设置了过期键的数据中,随机淘汰
volatitle-lfu:当内存达到最大后,从设置了过期键的数据中,淘汰最少使用的数据
volatitle-ttl:当内存达到最大后,淘汰最早过期的数据
标准的LRU算法需要维护一个链表,当某个数据被使用时就把它放到链表头部,这样就保证了链表是按照使用时间排序的,当需要淘汰数据时,就从链表尾部删除部分数据。
标准LRU算法要进行大量的计算,redis采取了近似LRU算法的操作。
redis给每个键维护了一个24bit的属性字段,用来记录最后一次使用的时间戳。redis根据maxmemory-samples随机抽取一部分数据,将最旧的数据淘汰,指到内存降下来。后来redis又引入了淘汰池,淘汰池内的数据量等于maxmemory-samples,每次淘汰时将随机抽取的数据和淘汰池中的数据合并,淘汰最旧的数据,然后将剩余最旧的数据维护到淘汰池中,等待下次循环。
为什么需要LFU算法?
现在假设这种场景:redis中有两个键A和B,其使用频率如上面所示,当到达$时,因为A的使用时间比B晚,按照LRU算法会淘汰B,但是从使用频率上看,B明显比A使用的更频发,应该淘汰A。
为了解决上面的问题,Redis引入了LFU算法,淘汰最少使用的数据。原理如下:
LFU给每个数据维护了一个计数器,每次使用都会使计数器增加,淘汰使用次数最少的键。但是这样又有新的问题:
①新的key如果计数器为0,可能就会一直被淘汰
redis解决方案:redis给每个新的键的计数器一个初始值
②某个键可能前一段时间被频繁使用,但是一段时间后使用频率就会下降。
redis解决方案:如果某个键一段时间不使用,计数器会减小
redis过期键进行删除的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于redis如何处理过期数据、redis过期键进行删除的信息别忘了在本站进行查找喔。








