今天,我和大家分享一篇关于 Redis 有关过期键的内容,主要有四个内容:

1. 如何设置过期键

2. 如何取消设置的过期时间

3. 过期键的过期策略是怎样的

4. RDB、AOF 和复制对过期键的处理又是怎样的

1. 设置键的过期时间

redis 一共有 4 个命令来设置键的生存时间(可以存活多久)或过期时间(什么时候被删除)

1. expire :将 key 的生存时间设置为 ttl 秒

2. pexpire :将 key 的生存时间设置为 ttl 毫秒

3. expireat :将 key 的过期时间设置为 timestamp 所指定的秒数时间戳

4. pexpireat :将 key 的过期时间设置为 timestamp 所指定的毫秒数时间戳

本质上,上述四种命令都是通过 pexpireat 命令来实现的。

下面我们简单实践一下命令(因为命令比较简单,这里我只使用 expire 和 expireat 来举个例子)

设置过期键就是按照上述命令去操作,那如果说,自己不小心设置错了过期时间,那么我们应该怎么办呢?—— 答案是可以删除先前的过期时间。

2. 移除过期时间

移除也很简单,通过persist 命令可以移除一个键的过期时间,举个栗子:

此时,如果我们没有移除过期时间,那么如果一个键过期了,那它什么时候会被删除呢?

这个问题就会有以下三种答案了,它们分别代表三种不同的删除策略

3. 过期键的删除策略

三种不同的删除策略分别是:

1. 定时删除

2. 惰性删除

3. 定期删除

下面我详细说下这三个策略是什么作用,区别是什么。

3.1定时删除

在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。

优点:对内存最友好的。可以及时释放键所占用的内存。

缺点:对 CPU 不友好。特别在过期键比较多的情况下,删除过期键会占用相当一部分 CPU 时间。同时在内存不紧张,CPU 紧张的情况下,将 CPU 用在删除和当前任务不想关的过期键上,无疑会对服务器响应时间和吞吐量造成影响。

3.2 惰性删除

放任键过期不管,但是每次从键空间中读写键时,都会检查取得的键是否过期。如果过期就删除该删,否则就返回该键。

PS:键空间是一个保存了数据库所有键值对的数据结构

优点:对 CPU 最友好。只有在操作的时候进行过期检查,删除的目标仅限于当前需要处理的键,不会在删除其他无关本次操作的过期键上花费任何 CPU 时间。

缺点:对内存不友好。这个十分容易理解了,键过期了,但因为一直没有被访问到,所以一直保留着(除非手动执行 flushdb 操来于清空当前数据库中的所有 key),相当于内存泄漏。

3.3定期删除

每隔一段时间,程序就对数据库进行检查,删除里面的过期键。至于要删除多少过期键,以及检查多少数据库,则有算法决定。

该策略是上述两种策略的折中方案,需要通过实际情况,来设置删除操作的执行时长和频率。

明白了过期键的删除策略后,那 redis 服务器又是采用什么策略来删除过期键的呢?

实际上,Redis 服务器使用的是惰性删除和定期删除两种策略,通过配合使用,服务器可以很好的平衡 CPU 和内存。

其中惰性删除为 redis 服务器内置策略。而定期删除可以通过以下两种方式设置:

1. 配置 redis.conf 的 hz 选项,默认为10 (即 1 秒执行 10 次,值越大说明刷新频率越快,对 Redis 性能损耗也越大)

2. 配置 redis.conf 的 maxmemory 最大值,当已用内存超过 maxmemory 限定时,就会触发主动清理策略

4. RDB 对过期键的处理

先下结论:过期键对 RDB 不会造成影响

4.1生成 RDB 文件

程序会被数据库中的键进行检查,过期的键不会被保存到新创建的 RDB 文件中。因此数据库中的过期键不会对生成新的 RDB 文件造成影响

4.2载入 RDB 文件

这里需要分 2 种情况说明:

1. 如果服务器以主服务器模式运行,则在载入 RDB 文件时,程序会对文件中保存的键进行检查,过期键不会被载入到数据库中。所以过期键不会对载入 RDB 文件的主服务器造成影响。

2. 如果服务器以从服务器模式运行,则在载入 RDB 文件时,不论键是否过期都会被载入到数据库中。

但由于主从服务器在进行数据同步时,从服务器的数据会被清空。所以一般来说,过期键对载入 RDB 文件的从服务器也不会造成影响。

5. AOF 对过期键的处理

结论同样是不会造成影响,下面接着细说

5.1AOF 文件写入

当服务器以 AOF 持久化模式运行时,如果数据库某个过期键还没被删除,那么 AOF 文件不会因为这个过期键而产生任何影响,依旧保留。

而当过期键被删除后,那么程序会向 AOF 文件追加一条 DEL 命令来显式地记录该键被删除。

5.2AOF 重写

执行 AOF 重写过程中,也会被数据库的键进行检查,已过期的键不会被保存到重写后的 AOF 文件中。因此不会对 AOF 重写造成影响

6. 复制对过期键的处理

当服务器运行在复制模式下,由主服务器来控制从服务器的删除过期键动作,目的是保证主从服务器数据的一致性。

那到底是怎么控制的呢?

1. 主服务器删除一个过期键后,会向所有从服务器发送一个 DEL 命令,告诉从服务器删除这个过期键

2. 从服务器接受到命令后,删除过期键

PS:从服务器在接收到客户端对过期键的读命令时,依旧会返回该键对应的值给客户端,而不会将其删除。

--End--

你应该知道的Redis过期键和过期策略相关推荐

  1. Redis过期键的删除策略

    文章目录 立即删除 惰性删除 定时删除 Redis使用的策略 Redis中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间.作为一个缓存数据库,这是非常实用的.如我们一 ...

  2. 面试前必须要知道的Redis面试题

    前言 回顾前面: 从零单排学Redis[青铜] 从零单排学Redis[白银] 从零单排学Redis[黄金] 从零单排学Redis[铂金一] 从零单排学Redis[铂金二] Redis 今天来分享一下R ...

  3. Redis源码剖析(四)过期键的删除策略

    Redis是支持时间事件的,所谓时间事件,是为某个键值对设置过期时间,时间一到,Redis会自动删除该键值对.例如使用SET命令添加字符串类型的键值对 127.0.0.1:6379> SET b ...

  4. reids过期键删除的策略-惰性删除 定期删除

    反正就是主动删 就是对数据进行额外的处理 占用CPU的时间 对性能响应时间 吞吐量会有影响 不主动删 等到查数据再看键过没过期 就是不用进行额外处理 但是过期的键没有及时删除 占内存 浪费内存 反正就 ...

  5. string类型加减_测试人员应该知道的Redis知识(四) String

    一.概述 完整的说,应该是Binary-safe string,二进制安全字符串.从官网内容我们可以看到,String类型是最简单的一种数据类型,和Memcached的类型一致,一个key对应一个va ...

  6. Linux运维需要知道的Redis经验

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:rrd.me/gmRQb Redis 在当前的技术社区里是非 ...

  7. 跨境电商卖家应该知道的3个社交媒体营销策略

    关键词:跨境电商卖家.社交媒体营销 社交媒体是获取.吸引和留住客户的强大营销渠道.普通人拥有超过八个社交媒体帐户,使用每个平台参与社区,发现新产品并与朋友和家人保持联系. 社交媒体最强大的方面是,您的 ...

  8. redis设置键的生存时间或过期时间

    设置键的生存时间或过期时间 通过EXPIRE 命令或者PEXPIRE 命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间( Time To Live , TTL) ,在经过指定的秒数或者毫 ...

  9. Redis之过期键删除策略

    (一)关于键的过期时间或生存时间   我们知道,Redis数据库是基于内存的,但是如果一些不用的键在内存中一直存在,那么久而久之,就有可能会发生oom的情况.所以,redis数据库提供了常用的EXPI ...

  10. redis的过期键删除策略

    Redis 中 key 的过期删除策略 Redis 中提供了三种过期删除的策略 1.定时删除 在设置某个 key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的 ...

最新文章

  1. 糟糕的css用法 1
  2. vfp全国计算机二级,全国计算机二级VFP试题
  3. 机器人搬运礼盒程序_礼盒厂公司2020范文
  4. 第十一篇: Ajax Control Toolkit 控件包--下载与安装
  5. 如何发现假库存照片(并将合适的人归于属性)
  6. java平移变换_java移位运算符:(左移)、(带符号右移)和(无符号右移)。...
  7. leetcode66. 加一
  8. IT外包 OpenEIM 强调CMMI等级
  9. python成绩统计_python统计考试成绩代码参考
  10. flex 常用正则验证举例
  11. Python中Selenium设置无界面访问
  12. [SVM系列之一]白话支持向量机(SVM)
  13. 打开网页自动弹出QQ对话框的3种方法
  14. C/C++编写Windows窗口应用程序(Win32程序),非黑漆漆的控制台窗口
  15. 在vue.js中实现a标签href tel的打电话功能
  16. C#判断用户是否使用微信浏览器,并据此来显示真实内容或二维码
  17. dom4j解析XML实例
  18. 微信{errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}
  19. 2022年全球与中国油性凝胶面膜市场现状研究
  20. c 语言程序编辑,C语言程序编辑学习篇—编程者说之C语言

热门文章

  1. 流畅的python读书笔记-第十章-序列的修改、散列和切片
  2. 关于vue自定义事件中,传递参数的一点理解
  3. 支持10秒自毁的新芯片
  4. mac上virtualbox创建vm需要注意启动顺序
  5. NBU备份数据库时的ORA-27211错误分析解决
  6. 消费者反映鸡蛋难吃后的37种回答方法
  7. Zebra命令模式分析
  8. msm 关机充电开启与关闭
  9. mmap 系统调用 的使用
  10. linux系统奔溃之vmcore:kdump 的亲密战友 crash