Redis 中数据库键的过期时间都保存在过期字典中, 当一个键过期了, Redis 存在三种不同的删除策略: 定时删除, 惰性删除和定期删除
定时删除
定义
在设置键的过期时间的同时创建一个计时器, 让定时器在键过期时间来临时, 立即执行对键的删除操作.
定时删除策略对内存是最友好的: 通过使用定时器, 定时删除策略可以保证过期键会尽快被删除, 并且释放过期键所占用的内存.
但是另一方面, 它对 CPU 时间是嘴不友好的: 在过期键比较多的情况下, 删除过期键这一行为可能会占用相当一部分的 CPU 时间, 在内存不紧张但是 CPU 时间紧张的情况下, 将 CPU 时间用在删除和当前任务无关的过期键上, 无疑会对服务器的响应时间和吞吐量造成影响.
惰性删除
定义
放任过期键不管, 但是每次从键空间中获取键时都检查取得的键是否过期, 如果过期的话, 就删除该键; 如果没有过期则返回该键.
惰性删除策略对 CPU 时间来说是最友好的, 但是它对内存是最不友好的: 如果一个键已经过期, 而这个键又恰好没有被访问到的话, 那么它可能永远都不回被删除, 甚至可以将这种情况视为一种内存泄漏 -- 无用的垃圾数据占用了大量的内存, 而服务器却不能主动去释放它们, 这对于运行状态非常依赖于内存的 Redis 服务器来说, 并不是一个好消息.
定期删除
定义
每隔一段时间, 程序都会对数据库进行一次检查, 删除里面的过期键. 至于要删除多少过期键, 以及要检查多少个数据库, 则由算法决定.
从上面对定时删除和惰性删除的讨论来看, 这两种删除方式在单一使用时都有非常明显的缺陷, 定期删除策略可以看作是两种策略的一种整合和折中:
定期删除策略每隔一段时间执行一次删除过期键操作, 并通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响.
通过定期删除过期键, 定期删除策略有效减少了因为过期键而带来的内存浪费
但是定期删除策略的难点是确定删除操作执行的时长和频率:
如果删除操作执行太过频繁, 或者执行的时间太长, 定期删除策略就会退化成定时删除策略, 以至于 CPU 时间过多的消耗在删除过期键上
如果删除操作执行的太少, 或者执行的时间太短, 定期删除策略又会和惰性删除策略一样, 出现浪费内存的情况
下面关于 Redis 的文章您也可能喜欢, 不妨参考下:
Ubuntu 14.04 下 Redis 安装及简单测试 https://www.linuxidc.com/Linux/2014-05/101544.htm
Redis 主从复制基本配置 https://www.linuxidc.com/Linux/2015-03/115610.htm
CentOS 7 下 Redis 的安装与配置 https://www.linuxidc.com/Linux/2017-02/140363.htm
Ubuntu 14.04 安装 Redis 与简单配置 https://www.linuxidc.com/Linux/2017-01/139075.htm
Ubuntu 16.04 环境中安装 php7.0 Redis 扩展 https://www.linuxidc.com/Linux/2016-09/135631.htm
Redis 单机 & 集群离线安装部署 https://www.linuxidc.com/Linux/2017-03/141403.htm
CentOS 7.0 安装 Redis 3.2.1 详细过程和使用常见问题 https://www.linuxidc.com/Linux/2016-09/135071.htm
Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 https://www.linuxidc.com/Linux/2016-09/135631.htm
Ubuntu 15.10 下 Redis 集群部署文档 https://www.linuxidc.com/Linux/2016-06/132340.htm
Redis 实战 中文 PDF http://www.linuxidc.com/Linux/2016-04/129932.htm
来源: http://www.linuxidc.com/Linux/2019-02/157115.htm