Redis 的数据过期了会不会马上删除

数据库 投稿 57800 1 评论

Redis 的数据过期了会不会马上删除

并不会立马删除,Redis 有两种删除过期数据的策略:定期选取部分数据删除,惰性删除;

从 Redis 2.6 开始,过期错误为 0 到 1 毫秒。

从 Redis 版本 7.0.0 开始: 添加了选项:、和、 选项。

  • NX:当 key 没有过期时才设置过期时间;

  • XX:只有 key 已过期的时候才设置过期时间;

  • GT:仅当新的到期时间大于当前到期时间时才设置过期时间;

  • LT:仅在新到期时间小于当前到期时间才设置到过期时间。

过期与持久化

key 过期信息是用 Unix 绝对时间戳表示的。

为了让过期操作正常运行,机器之间的时间必须保证稳定同步,否则就会出现过期时间不准的情况。

惰性删除

比如当 Redis 收到客户端的 请求,就会先检查  是否已经过期,如果过期那就删除。

删除过期数据的主动权交给了每次访问请求。

int expireIfNeeded(redisDb *db, robj *key, int force_delete_expired) {
  	// key 没有过期,return 0
    if (!keyIsExpired(db,key)) return 0;
    if (server.masterhost != NULL) {
        if (server.current_client == server.master) return 0;
        if (!force_delete_expired) return 1;
    }

    if (checkClientPauseTimeoutAndReturnIfPaused()) return 1;

    /* Delete the key */
    deleteExpiredKeyAndPropagate(db,key);
    return 1;
}

定期删除

仅仅靠客户端访问来判断 key 是否过期才执行删除肯定不够,因为有的 key 过期了,但未来再也没人访问,这些数据要怎么删除呢?

所谓定期删除,也就是 Redis 默认每 1 秒运行 10 次(每 100 ms 执行一次),每次随机抽取一些设置了过期时间的 key,检查是否过期,如果发现过期了就直接删除。

注意:并不是一次运行就检查所有的库,所有的键,而是随机检查一定数量的键。

  1. 从所有设置了过期时间的 key 集合中随机选择 20 个 key

  2. 删除

    「步骤 1」发现的所有过期 key 数据;

    「步骤 2 」结束,过期的 key 超过 25%,则继续执行「步骤 1」。

这也就意味着在任何时候,过期 key 的最大数量等于每秒最大写入操作量除以 4。

你想呀,假设 Redis 里存放了 100 w 个 key,都设置了过期时间,每隔 100 毫秒就检查 100 w 个 key,CPU 全浪费在检查过期 key 上了,Redis 也就废了。

不管是定时删除,还是惰性删除。当数据删除后,会生成删除的指令记录到  和  节点

会不会导致 Redis 内存耗尽,怎么破?

内存淘汰机制。

编程笔记 » Redis 的数据过期了会不会马上删除

赞同 (56) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(1)个小伙伴在吐槽
  1. 不会让读者感到枯燥。
    街头艺人 2023-10-22 22:30 (1年前) 回复