Redis删除过期key策略详解

 更新时间:2023年10月18日 11:09:48   作者:fking86  
Redis是一款高性能的开源内存数据库,广泛应用于缓存、消息队列、实时分析等场景,在Redis中,我们经常需要删除过期的key,以释放内存空间并保持数据的有效性,本文将为您详细介绍Redis的过期key删除策略,帮助您更好地管理和优化Redis数据库

Redis中key的的过期时间

Redis 中可以为 key 设置过期时间,到期后 key 会自动被删除,过期时间可以通过以下几种方式设置:

在创建 key 时使用 EXPIRE 命令设置过期时间(秒级)

示例:

EXPIRE key1 30 # 30秒过期

使用 EXPIREAT 命令设置一个精确的过期时间(unix 时间戳)

示例:

EXPIREAT key2 1651811000 # 2022-05-06 14:30:00 过期

使用 PEXPIRE 命令设置过期时间(毫秒级)

示例:

PEXPIRE key3 6000 # 6秒过期

使用 PEXPIREAT 命令设置毫秒级精确过期时间

示例:

PEXPIREAT key4 1651811000000 # 2022-05-06 14:30:00.000过期 

在 Redis 配置文件中设置所有 key 的默认过期时间

通过 default-ttl 参数配置默认过期时间

# redis.conf
default-ttl 3600 # 默认1小时过期

使用 PERSIST 命令可以移除一个 key 的过期时间设置

PERSIST key2 # 移除key2的过期时间

使用 TTL 命令可以查看一个 key 剩余的过期时间

TTL key3 # 查看key3的剩余过期时间

Redis 提供了灵活的 key 过期时间设置,可以按需为不同 key 设置过期时间。

Redis过期键删除策略

Redis key过期的方式有三种:

  • 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
  • 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
  • 当前已用内存超过maxmemory限定时,触发主动清理策略

1、定时删除

定时删除是在设置key的过期时间的同时,会创建一个定时器(timer)。定时器在key的过期时间来临时,立即执行对key的删除操作。

此种删除策略可以保证过期key会尽可能快的被删除,并释放过期key所占用的内存。

但是此种策略对CPU时间是最不友好的。在过期key比较多的情况下,删除过期key这一行为可能会占用相当一部分CPU时间,在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期key上,无疑会对服务器的响应时间和吞吐量造成影响。

例如,正有大量的命令请求在等待服务器处理,并且服务器当前不缺少内存的情况下,服务器应当优先将CPU时间用在处理客户端的命令请求上面,而不是用在删除过期key上面。

并且创建一个定时器(timer)需要用到Redis服务器中的时间事件,而当前时间事件是用无序链表实现的,查找一个事件的时间复杂度为O(N),并不能高效地处理大量时间事件。要让服务器创建大量的定时器,从而实现定时删除,在现阶段来说并不现实。

优点:

1.可以自动清理不需要的缓存数据,减少内存占用。

2.可以定时刷新部分缓存,保证数据实时性。

3.可以根据业务需求自定义不同的数据缓存周期。

4.操作简单,只需要设置过期时间,不需要手动删除。

缺点:

1.需要额外的内存来存储 key 的过期时间。

2.过期删除是被动操作,无法按需主动删除。

3.过期时间的精度只到秒级,无法更细粒度控制。

4.如果过期 key 数量很多,过期删除时还是有一定性能开销。

5.只依赖过期时间可能导致一段时间内缓存量激增,需配合其它方式控制。

示例:

// 设置10秒过期
jedis.setex("data", 10, "cache"); 

2、定期删除

定期删除是指Redis会每隔一段时间,对部分key进行检查和删除。具体来说,Redis会每隔一段时间随机抽取一部分key,检查其是否过期,如果过期则删除。

优点:

1.减少每次访问的时间复杂度。

2.减少删除操作对CPU时间的影响。

缺点:

可能会有一些过期key没有被及时删除。

通过定期删除策略,可以有效地减少因为过期key而带来的内存浪费。

示例:

// 定期扫描删除
public void delKeys(){
  Set<String> keys = jedis.keys("cache:*");
  jedis.del(keys.toArray(new String[0])); 
}

// 调度执行
scheduledExecutorService.scheduleAtFixedRate(this::delKeys, 0, 1, TimeUnit.HOURS);

3、惰性删除

惰性删除是指在访问某个key时,Redis会先检查该key是否过期,如果过期则立即删除。这种策略的优点是能够及时释放内存空间,但缺点是会增加每次访问的时间复杂度,因为需要进行过期检查。

惰性删除是定时删除和定期删除的折中处理方案。它放任key过期不管,但是每次获取key时,都会检查取得的key是否过期,如果过期,则删除该key;若没有过期,就返回该key的值。

优点:

对CPU时间来说是最友好的,只在取出key时,才对key进行过期检查,即只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的key,不会在删除其他无关的过期key上花费任何CPU时间。

缺点:

对内存是最不友好的。如果一个key已经过期,而这个key又仍然保留在db中,那么只要这个过期key不被删除,它所占用的内存就不会释放。例如,如果db中有非常多的过期key,而这些过期key又恰好没有被访问到的话,那它们也许永远也不会被删除,除非用户手动执行flushdb命令清空,这样会导致大量的无用的脏数据占用大量的内存。

示例:

jedis.set("key", "value");
jedis.unlink("key"); // 惰性标记删除

总结

Redis的过期key删除策略是惰性删除、定期删除和定时删除的混合策略。惰性删除能够及时释放内存空间,但会增加每次访问的时间复杂度;定期删除能够减少时间复杂度,但可能会有一些过期key没有被及时删除;定时删除能够精确控制过期时间,但需要额外的定时任务。通过这种混合策略,Redis能够在保证内存空间的同时,尽可能地减少对性能的影响。

以上就是Redis删除过期key策略详解的详细内容,更多关于Redis删除过期key的资料请关注脚本之家其它相关文章!

相关文章

  • 使用Redis实现实时排行榜的示例

    使用Redis实现实时排行榜的示例

    为了实现一个实时排行榜系统,我们可以使用Redis的有序集合,本文主要介绍了使用Redis实现实时排行榜的示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • Redis分布式缓存-Redis持久化详解

    Redis分布式缓存-Redis持久化详解

    RDB持久化将内存数据快照到磁盘,用于故障恢复;AOF持久化记录每个写命令,提供数据安全性,两者各有优缺点,可根据需求选择或结合使用
    2024-12-12
  • Redis数据库的使用场景介绍(避免误用Redis)

    Redis数据库的使用场景介绍(避免误用Redis)

    这篇文章主要介绍了Redis数据库的使用场景介绍(避免误用Redis),本文用简要的语言总结了Redis数据库的适应场合,人而避免错误的使用它而产生昂贵的维护代价,需要的朋友可以参考下
    2015-03-03
  • 详解Redis 键和字符串常用命令

    详解Redis 键和字符串常用命令

    字符串是 Redis 最基本的数据结构,它将以一个键 和一个值 储存在 Redis 内部,本文重点给大家介绍Redis键和字符串常用命令,感兴趣的朋友一起看看吧
    2022-02-02
  • Redis集群的搭建图文教程

    Redis集群的搭建图文教程

    下面小编就为大家分享一篇Redis集群的搭建图文教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • Redis五大基本数据类型及对应使用场景总结

    Redis五大基本数据类型及对应使用场景总结

    Redis有五种基本数据类型,分别是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),这些基本数据类型使得Redis具备了丰富的数据结构和功能,适用于各种不同的应用场景,本文就给大家详细的介绍一下这五大类型
    2023-08-08
  • Redis过期时间的设计与实现代码

    Redis过期时间的设计与实现代码

    在 Redis 中,键的过期时间设计与实现是一个重要的功能,这使得 Redis 可以自动删除在指定时间后不再需要的键,下面详细介绍 Redis 过期时间的设计和实现,包括设置过期时间、过期键的存储结构、过期键的删除策略等,需要的朋友可以参考下
    2024-08-08
  • redis哨兵模式分布式锁实现与实践方式(redisson)

    redis哨兵模式分布式锁实现与实践方式(redisson)

    这篇文章主要介绍了redis哨兵模式分布式锁实现与实践方式(redisson),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Redis实现用户签到的示例代码

    Redis实现用户签到的示例代码

    Redis的位图可以高效实现用户签到功能,每个bit位对应一个签到状态,节省存储空间,利用SETBIT、GETBIT等命令操作签到数据,可统计连续签到天数和本月签到情况,感兴趣的可以了解一下
    2024-09-09
  • Redis处理高并发机制原理及实例解析

    Redis处理高并发机制原理及实例解析

    这篇文章主要介绍了Redis处理高并发机制原理及实例解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值析,需要的朋友可以参考下
    2020-08-08

最新评论