redis的key过期后是否立即删除?

简介:我们通常会把一些经常使用的数据缓存在redis中,这些缓存数据只要我们没有设置过期时间,它就会一直存在,除非我们主动删除。如果我们设置了过期时间,那些key到期后是立即删除吗?其实这个问题主要由redis的过期策略和内存淘汰策略决定的

作为服务器开发人员,为了提高网站的性能,缓存是我们经常使用的方法。在缓存这一领域中,redis这个工具是目前最为常用的。

我们通常会把一些经常使用的数据缓存在redis中,这些缓存数据只要我们没有设置过期时间,它就会一直存在,除非我们主动删除。如果我们设置了过期时间,那些key到期后是立即删除吗?其实这个问题主要由redis的过期策略和内存淘汰策略决定的。

Redis过期策略分为被动方式、定期删除两种方式。其中定期删除也被称为主动方式:

被动方式

当客户端发送请求获取某个key时,检查key是否过期,如果过期就将key删除。这种方式的优点就是对CPU消耗最小。

如果key没有被访问,那么key就会一直会存在内存中,随着key的数据越来越多,内存也就逐渐被占满,影响使用,所以就引出了定期删除的方式。

定期删除

定期在过期的key中随机筛选20个key,然后把筛选的这20个key删除,如果有超过25%的key过期继续筛选并删除。定期任务的频率是每秒10次。这种方式能过不仅能减少cpu的消耗,同时也能及时的释放被占用的内存。

定期任务的频率可以通过配置文件参数hz来修改,hz的取值范围1~500。增大hz参数的值会提升各项定期任务的执行频率,但也会提高Redis服务的CPU使用率。默认值10在一般情况下已经可以满足需求,如果业务场景对于某些定期任务的执行频率有很高的要求,您可以尝试在100以内调整参数值。将hz的值增加到100以上对CPU使用率有相对较大的影响,请谨慎操作

hz的意义是为了定期检测资源和服务状态并根据预定策略执行相应的操作,Redis调用一个内部函数来执行多种后台任务,例如:

  • 计算LRU信息并清除过期key
  • 关闭超时的客户端连接
  • 整理hash类型的数据
  • 执行RDB或AOF持久化相关操作
  • 更新统计信息

内存淘汰策略

除了在过期的时候会被清理,Redis也会根据剩余可用内存进行淘汰清理,这种就叫淘汰策略。

Redis通过maxmemory指令来限制redis key的内存使用,当Redis达到maxmemory配置的内存限制之后就开始内存淘汰策略,淘汰策略又分以下8种:

  • noeviction:不删除数据,在达到内存限制时写入新值时会报错
  • allkeys-lru:删除最近最少使用的key
  • allkeys-lfu:删除最不常用的key

allkeys-lruallkeys-lfu区别在于淘汰算法的不同。 allkeys-lru表示Redis将使用最近最少使用(Least Recently Used)算法来淘汰键,也就是说,当Redis需要淘汰某些键时,它将优先淘汰最近最少使用的键。 allkeys-lfu表示Redis将使用最不经常使用(Least Frequently Used)算法来淘汰键,也就是说,当Redis需要淘汰某些键时,它将优先淘汰最不经常使用的键。 因此,allkeys-lru适用于那些最近使用频率较低的键,而allkeys-lfu适用于那些使用频率非常低的键。在实际应用中,应根据具体情况选择合适的淘汰策略来优化Redis的性能和内存使用。

  • volatile-lru:删除最近最少使用且设置了过期时间的key
  • volatile-lfu:删除最不常使用且设置了过期时间的key

volatile-lru和volatile-lfu也是用于设置Redis的淘汰策略的选项,但是它们的淘汰对象是有过期时间的键(即带有TTL的键),而不是所有的键。 volatile-lru表示Redis将使用最近最少使用(Least Recently Used)算法来淘汰有过期时间的键,也就是说,当Redis需要淘汰某些有过期时间的键时,它将优先淘汰最近最少使用的键。 volatile-lfu表示Redis将使用最不经常使用(Least Frequently Used)算法来淘汰有过期时间的键,也就是说,当Redis需要淘汰某些有过期时间的键时,它将优先淘汰最不经常使用的键。 因此,volatile-lru适用于那些最近使用频率较低的有过期时间的键,而volatile-lfu适用于那些使用频率非常低的有过期时间的键

  • allkeys-random:随机删除key
  • volatile-random:随机删除设置了过期时间的key
  • volatile-ttl:删除设置了过期时间的key,按照TTL时间从小到大删除

注意:

volatile 开头的规则都是删除设置了过期时间的key,

allkeys 开头的规则都是删除所有符合条件的key。

默认的淘汰策略是noeviction,可以通过redis.conf配置文件配置淘汰策略

1、在redis.conf配置文件种配置,,如下所示,限制Redis可使用内存为100兆:

# 设置最大可使用的内存
maxmemory 100mb

# 设置淘汰策略
maxmemory-policy noeviction

2、在运行时通过指令设置:

//设置最大内存限制
config set maxmemory 100mb

//设置淘汰策略
config set maxmemory-policy valatile-lru

//查看当前淘汰策略
config get maxmemory-policy 

不建议大家使用第二种方式,如果服务器重启或者Redis重启,需要重新设置。相反第一种会永久生效

从节点的key删除方式

从节点过期的key不主动删除。只有主节点的key过期或者淘汰的时候,主节点会同步一个del指令给从节点,进而让从节点删除key。

因为是主节点删除后同步到从节点,如果主节点不能及时同步del指令,key可能还在从节点中,但是这个key已经过期了。为了解决这个问题,在不影响数据一致性的前提下,我们在获取key的时候应该判断一下当前key是否过期,如果过期直接在主库中删除key,再同步到从库。

总结:

在使用Redis时最好是设置过期时间,或者是定期的去清理不用的缓存key,这样才能最大的提高内存的使用率。

上述中如有不对的地方或者没有将清楚的大家可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1