Redis过期数据是否会被立马删除


Posted in Redis onJuly 23, 2022

引言

当 key 达到过期时间,Redis 就会马上删除么?

先说结论:并不会立马删除。

Redis 有两种删除过期数据的策略:

  • 定期选取部分数据删除;
  • 惰性删除;

该命令在 Redis 2.4 版本,过期时间并不是很精确,它可能在零到一秒之间。

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

EXPIRE key seconds [ NX | XX | GT | LT]

 指令可以将指定的 key 设置过期时间,如果没有设置过期时间, key 将一直存在,除非我们明确将其删除,比如执行 DEL 指令。

所谓”狡兔死,走狗烹“,没用了就干掉,跟 35 岁就“毕业”是一个道理。

好慌……

从 Redis 版本 7.0.0 开始:EXPIRE 添加了选项:NXXXGTLT 选项。

  • NX:当 key 没有过期时才设置过期时间;
  • XX:只有 key 已过期的时候才设置过期时间;
  • GT:仅当新的到期时间大于当前到期时间时才设置过期时间;
  • LT:仅在新到期时间小于当前到期时间才设置到过期时间。

过期与持久化

主从或者集群架构中,两台机器的时钟严重不同步,会有什么问题么?

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

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

比如两台时钟严重不同步的机器发生 RDB 传输, slave 的时间设置为未来的 2000 秒,假如在 master 的一个 key 设置 1000 秒存活,当 Slave 加载 RDB 的时候 key 就会认为该 key 过期(因为 slave 机器时间设置为未来的 2000 s),并不会等待 1000 s 才过期。

Redis过期数据是否会被立马删除

机器时钟不同步导致过期混乱

惰性删除

惰性删除很简单,就是当有客户端的请求查询该 key 的时候,检查下 key 是否过期,如果过期,则删除该 key

比如当 Redis 收到客户端的GET movie:小泽#玛……利亚.rmvb 请求,就会先检查 key = movie:小泽#玛……利亚.rmvb 是否已经过期,如果过期那就删除。

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

该实现通过 expireIfNeeded函数实现,源码路径:src/db.c

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,检查是否过期,如果发现过期了就直接删除。

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

具体步骤如下:

Redis过期数据是否会被立马删除

定时删除

  • 从所有设置了过期时间的 key 集合中随机选择 20 个 key;
  • 删除「步骤 1」发现的所有过期 key 数据;
  • 「步骤 2 」结束,过期的 key 超过 25%,则继续执行「步骤 1」。

删除的源码 expire.c 的 activeExpireCycle 函数实现。

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

为啥不检查所有设置过期时间的 key?

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

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

码哥,如果过期的数据太多,定时删除无法删除完全(每次删除完过期的 key 还是超过 25%),同时这些 key 也再也不会被客户端请求,也就是无法走惰性删除,会怎样?

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

这个问题问得好,答案是走内存淘汰机制。

以上就是Redis过期数据是否会被立马删除的详细内容,更多关于Redis过期数据的资料请关注三水点靠木其它相关文章!

Redis 相关文章推荐
在redisCluster中模糊获取key方式
Jul 09 Redis
Redis Cluster集群动态扩容的实现
Jul 15 Redis
关于redisson缓存序列化几枚大坑说明
Aug 04 Redis
基于Redis的List实现特价商品列表功能
Aug 30 Redis
Redis中有序集合的内部实现方式的详细介绍
Mar 16 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
浅谈Redis 中的过期删除策略和内存淘汰机制
Apr 03 Redis
Redis超详细讲解高可用主从复制基础与哨兵模式方案
Apr 07 Redis
Redis基本数据类型String常用操作命令
Jun 01 Redis
浅谈Redis缓冲区机制
Jun 05 Redis
Redis唯一ID生成器的实现
Jul 07 Redis
如何使用注解方式实现 Redis 分布式锁
Jul 23 #Redis
redis lua限流算法实现示例
Redis Lua脚本实现ip限流示例
Jul 15 #Redis
redis protocol通信协议及使用详解
Jul 15 #Redis
Redis sentinel哨兵集群的实现步骤
Jul 15 #Redis
Redis唯一ID生成器的实现
Jul 07 #Redis
Redis+AOP+自定义注解实现限流
Jun 28 #Redis
You might like
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
PHP STRING 陷阱原理说明
2010/07/24 PHP
php curl_init函数用法
2014/01/31 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
Javascript 自定义类型方法小结
2010/03/02 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
js实现聊天对话框
2020/02/08 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python中的字典操作及字典函数
2018/01/03 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
python中提高pip install速度
2020/02/14 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
教育科研先进个人材料
2014/01/26 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
新兵入伍决心书
2015/09/22 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书