当前位置: 代码网 > it编程>数据库>Redis > Redis过期键删除策略解读

Redis过期键删除策略解读

2025年01月16日 Redis 我要评论
1.redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略当一个过期键被访问时,redis会检查这个键是否过期。如果过期,就会立即删除。如果没有过期,redis会

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

1.1惰性删除策略

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

1.2定期删除策略

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

1.3策略小结

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

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

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

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

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

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

惰性删除策略

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

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

定期删除策略

redis 的定期删除策略是通过一个配置参数来控制的,这个参数默认值为 10 秒钟,即 redis 每隔 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 命令,把数据的过期时间设置为具体的时间点,避免读到过期数据

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

  • 深入理解Redis大key的危害及解决方案

    一、背景redis作为后端开发中的一个常用组件,在开发过程中承担着非常重要的作用。在其实际使用过程中,我们常常会面临一些技术挑战,其中常见的问题就包括大key问题。当某些数据量较大…

    2025年01月19日 数据库
  • Redis事务与数据持久化方式

    Redis事务与数据持久化方式

    一、redis 事务1.1 事务本质一组命令的集合1.2 数据库事务与redis事务1.2.1 数据库事务数据库事务通过acid(原子性、一致性、隔离性、持久性... [阅读全文]
  • Redis实现和数据库的数据同步

    Redis实现和数据库的数据同步

    redis 和传统数据库的数据同步涉及如何保持缓存和持久化存储之间的数据一致性。这在高并发的环境中尤其重要。以下是几种常见的 redis 和数据库同步方法:1.... [阅读全文]
  • Redis高并发缓存问题分析及解决过程

    Redis高并发缓存问题分析及解决过程

    redis缓存问题解决方案1.缓存穿透1)什么是缓存穿透缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常出于容错的考虑,如果从存储层查不到数... [阅读全文]
  • Redis与缓存解读

    缓存在业务开发中,必然会存在需要频繁访问的数据即热点数据,如果通过访问数据库访问这些数据,由于数据存储在磁盘上,在频繁访问下会进行频繁的io操作,会导致数据库压力过大,响应速度变慢…

    2025年01月11日 数据库
  • Redis持久化解读

    redis 是内存级数据库,其数据存储在内存中,因此能够提供快速的读写速度。但我们知道内存属于掉电易失存储器,一旦断电,存储在内存中的数据就会丢失。在服务器重启和 redis 服务…

    2025年01月11日 数据库

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com