Redis是如何处理过期的key的?

本文探讨了Redis处理过期键的两种策略:惰性删除和主动随机删除。当客户端请求过期键时,Redis将执行惰性删除;此外,为确保数据一致性,Redis会定期检查并删除过期键,如果超过25%的键过期,过程将重新开始。主节点负责执行删除操作,并将DEL命令同步到AOF文件及从节点。

两种方式

  • 被动:惰性删除
  • 主动:随机删除

当客户端请求一个key时,redis发现该key已过期,则会触发删除操作(惰性删除)。

仅仅通过这种被动的方式处理是不够的,毕竟也可能存在大量过期的key永远不会被客户端访问,所以Redis会定期的测试一些随机的存在过期的key,如果过期则会删除(随机删除)。

  1. 随机测试20个存在过期时间的key
  2. 删除所有已过期的key
  3. 如果超过25%的key过期了,则从步骤1开始再来一遍

关于数据一致性,当一个key过期了,DEL操作会合到AOF文件中,并获得所有连接的从节点。这种方式使过期操作集中到主节点,避免数据一致性的错误。
从节点不会独立的进行删除过期key的操作,只能等待主节点的删除操作。

官方文档-EXPIRE key seconds

### Redis 键空间通知的启用方式 Redis 提供了键空间通知(Keyspace Notifications)功能,允许客户端订阅并接收与 Redis 数据库中键相关事件的通知。要监听 key过期事件,需要在 Redis 配置中启用 `notify-keyspace-events` 选项,并设置为包含 `Ex` 标志,表示仅监听键的过期事件。 --- ### 不使用 CONFIG 命令时的替代方案 如果由于安全策略或部署环境限制(如云服务)导致无法使用 `CONFIG` 命令来动态修改或查询配置,可以通过以下方式进行操作: 1. **通过静态配置文件启用键空间通知** 在 Redis 的配置文件 `redis.conf` 中直接设置: ```conf notify-keyspace-events Ex ``` 此设置确保 Redis 在启动时即启用了 key 过期事件的通知功能,无需运行时调用 `CONFIG SET` 或 `CONFIG GET` 命令 [^3]。 2. **在容器化部署中预设配置** 如果使用 Docker 等容器技术部署 Redis,可以在构建镜像时将配置文件挂载进容器,确保 Redis 实例启动时已启用键空间通知。例如,在运行容器时指定配置文件: ```bash docker run --name redis-container -v /path/to/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf ``` 3. **直接订阅 Redis 内部事件频道** Rediskey 过期事件会发布到名为 `__keyevent@<db>__:expired` 的频道中,其中 `<db>` 表示数据库编号(默认为 0)。应用可以直接订阅该频道,而无需依赖 `CONFIG` 命令进行配置检查。例如,使用 Spring Boot 可以自定义监听器如下: ```java @Component public class CustomKeyExpirationListener { @Autowired public CustomKeyExpirationListener(RedisConnectionFactory connectionFactory) { RedisConnection conn = connectionFactory.getConnection(); conn.pSubscribe((message, pattern) -> { String expiredKey = new String(message.getBody()); System.out.println("Key expired: " + expiredKey); }, "__keyevent@0__:expired".getBytes()); } } ``` --- ### 注意事项 - 在 Redis 集群模式下,需确保监听器连接到正确的主节点,因为集群环境下 key过期事件不会广播到所有节点 [^3]。 - 若使用 Redisson 客户端,可避免其自动检测机制,直接通过构造 `RedissonClient` 并指定服务器地址和配置,跳过对 `CONFIG` 命令的依赖。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值