Redis过期键删除策略解读

2025-01-16 04:50

本文主要是介绍Redis过期键删除策略解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,...

1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略

1.1惰性删除策略

当一个过期键被访问时,Redis会检查这个China编程键是否过期。如果过期,就会立即删除。如果没有过期,Redis会像处理普通键一样继续处理它。这种方式被称为惰性删除,因为Redis只会在需要访问一个键时才会检查android它是否过期,并在发现它过期后删除它。这种策略的好处是能够节省删除键所带来的 CPU 开销,因为 Redis 只有在有需要时才会删除键

1.2定期删除策略

Redis也使用一种定期删除策略来删除过期键。在这种策略下,Redis会每隔一段时间扫描数据库,查找所有已过期的键并将它们删除。这种方式称为定期删除,因为Redis会定期执行这个操作。这种策略的好处是能够保证 Redis 数据库中过期的键能够及时被删除,从而避免浪费空间。

1.3策略小结

Redis 的默认配置是同时使用惰性删除和定期删除两种策略。当 Redis 同时使用这两种策略时,惰性删除策略能够节省 CPU 开销,定期删除策略能够保证过期键及时被删除。

在一些特殊情况下,我们可能需要调整 Redis 的删除策略,比如对于一些不太重要的数据,我们可以只使用惰性删除策略来降低 Redis 的 CPU 开销,对于一些比较重要的数据,我们可以只使用定期删除策略来保证数据的正确性。这些调整可以通过 Redis 的配置参数来实现。

惰性删除策略可以让Redis更高效地使用内存,因为它只有在需要访问一个键时才会检查它是否过期。但是,它可能会导致过期键长时间滞留在内存中,直到下次被访问。定期删除策略则可以保证过期键及时被删除,但可能会对性能产生一定的影响,因为它需要周期性地遍历整个数据库。为了平衡内存使用和性能,Redis通常会同时使用这两种策略。

2.惰性删除策略与定期删除策略的使用

Redis 的惰性删除策略和定期删除策略默认都是开启的,所以在通常情况下,我javascript们不需要做任何特殊的配置即可使用这两js种策略。

如果你想要对 Redis 的删除策略进行调整,可以通过以下方式进行配置:

惰性删除策略

Redis 的惰性删除策略是默认开启的,如果你想要关闭惰性删除,可以在 Redis 的配置文件中将以下参数设置为 no:

# 是否启用惰性删除
# 如果设置为 no,则 Redis 将不使用惰性删除策略
# 默认为 yes
lazyfree-lazy-eviction no

定期删除策略

Redis 的定期删除策略是通过一个配置参数来控制的,这个参数默认值为 10 秒钟,即 RkNaonfVdXcedis 每隔 10 秒钟会检查一次过期键并删除过期键。如果你想要改变这个值,可以在 Redis 的配置文件中修改以下参数:

# 设置 Redis 定期删除策略的周期
# 默认为 10 秒钟
# 单位为秒
hz 100

在上面的配置中,我们将 Redis 定期删除策略的周期设置为 100 秒,即 Redis 每隔 100 秒钟会检查一次过期键并删除过期键。

需要注意的是,当 Redis 同时使用惰性删除和定期删除两种策略时,惰性删除策略会优先执行,即 Redis 只有在有客户端请求键时才会检查键是否过期,定期删除策略只有在惰性删除策略无法满足时才会起作用。

3.为什么Redis中会导致读取到过期数据

虽然定期删除策略可以释放一些内存,但是,Redis 为了避免过多删除操作对性能产生影响,每次随机检查数据的数量并不多。如果过期数据很多,并且一直没有再被访问的话,这些数据就会留存在 Redis 实例中。业务应用之所以会读到过期数据,这些留存数据就是一个重要因素。

惰性删除策略实现后,数据只有被再次访问时,才会被实际删除。如果客户端从主库上读取留存的过期数据,主库会触发删除操作,此时,客户端并不会读到过期数据。但是,从库本身不会执行删除操作,如果客户端在从库中访问留存的过期数据,从库并不会触发数据删除。

4.从库会给客户端返回过期数据吗?

Redis3.2版本之前,从库会返回过期数据。Redis3.2之后从库不会返回过期数据,会返回空值,但是还是有可能会读到。

如果使用的是 Redis 3.2 之前的版本,那么,从库在服务读请求时,并不会判断数据是否过期,而是会返回过期数据。在 3.2 版本后,Redis 做了改进,如果读取的数据已经过期了,从库虽然不会删除,但是会返回空值,这就避免了客户端读到过期数据。所以,在应用主从集群时,尽量使用 Redis 3.2 及以上版本。

使用了 Redis 3.2 后的版本,还是会读到过期数据,这跟 Redis 用于设置过期时间的命令有关系,有些命令给数据设置的过期时间在从库上可能会被延后,导致应该过期的数据又在从库上被读取到

4.1设置数据过期时间命令说明

  1. EXPIRE 和 PEXPIRE:它们给数据设置的是从命令执行时开始计算的存活时间;
  2. EXPIREAT 和 PEXPIREAT:它们会直接把数据的过期时间设置为具体的一个时间点。

主从库全量同步,收到EXPIRE命令,主库直接执行,全量同步完成发送给从库,从库执行的时候会在当前时间基础上加上存活时间,过期时间明显延后。

为了避免这种情况,在业务应用中使用 EXPIREAT/PEXPIREAT 命令,把数据的过期时间设置为具体的时间点,避免读到过期数据

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程China编程(www.chinasem.cn)。

这篇关于Redis过期键删除策略解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153080

相关文章

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复