Redis 的数据过期了就会马上删除么?

胖大海
• 阅读 388

Redis 的数据过期了就会马上删除么?

我在3A服务器平台购买了服务器,部署了相关环境,正好可以解答一下这个问题

先说结论,并不会立马删除,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 添加了选项:NX、XX和GT、LT 选项。

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:xxxx请求,就会先检查key = movie:xxxx是否已经过期,如果过期那就删除。

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

该实现通过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 的数据过期了就会马上删除么?

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

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

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

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

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

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

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

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

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Amazon S3 设置对象的生命周期Lifecycle
保存在S3上面的文件,有些是长期保存的,而有一些我们却不希望保存太久,过一段时间后就可以删除了。例如备份文件,太旧的就要删除;又或如日志文件,只保存某段时间的就行了。在S3中,可以通过Buckets的Lifecycle生命周期来设置文件对象的过期时间。文件一旦到达其设置的过期时间,就会自动被删除。我们现创建一个文件夹“temp”,在temp里上传一个
Wesley13 Wesley13
3年前
MySQL 常用命令手册 增删改查大法
一、数据库操作创建数据库语法:CREATEDATABASEdatabase_name;删除数据库删除数据库务必谨慎!因为执行删除命令后,所有数据将消失。语法:DROPDATABASEdatabase_name;选择数据库语法:
Wesley13 Wesley13
3年前
PHP面试题2019年阿里巴巴面试题及答案解析
一、单选题(共27题,每题5分)1.Memcache与Redis的比较错误的是?A、Memcache过期后,不删除缓存,会导致下次取数据数据的问题,Redis有专门线程,清除缓存数据;B、Memcache和redis都是只支持单线程;CPU利用方面Memcache和redis部分伯仲C、Memcache只支持keyvalue
Stella981 Stella981
3年前
Redis实战
!(https://oscimg.oschina.net/oscnet/6efe009e8d921bf9bbd3c257f6d77bc0fb7.png)Redis键(key)Redis键命令用于管理redis的键。DELkey该命令用于在key存在时删除key。127.
Stella981 Stella981
3年前
Harbor v2.0 镜像回收那些事
Harbor镜像回收流程Harbor镜像回收分两部分:1、删除镜像TAG2、执行垃圾清理早期Harbor1.0版本时,删除镜像TAG可以通过UI界面手动一个个选取删除,也可以调用官方提供的SDK删除(很早以前官方不维护了)。后来官方在1.9版本提供TAG保留策略,解决以
Stella981 Stella981
3年前
Redis从入门到放弃系列(七) 过期、内存淘汰策略
Redis从入门到放弃系列(七)过期、内存淘汰策略本文例子基于:5.0.4过期策略Redis对于设置了过期时间的key的过期策略有两种惰性删除定时随机删除惰性删除惰性删除的时机在于当你要获取该key的时候再去做判断.这里我以String类型
Wesley13 Wesley13
3年前
MySQL 清空表(truncate)与删除表中数据(delete) 详解
删除表信息的方式有两种:truncatetabletable\_name;delete\fromtable\_name;注:truncate操作中的table可以省略,delete操作中的\可以省略truncate、delete清空表数据的区别:1truncate是整体删除(速度较快),delete是逐条删
Stella981 Stella981
3年前
Redis中的Scan命令踩坑记
1原本以为自己对redis命令还蛮熟悉的,各种数据模型各种基于redis的骚操作。但是最近在使用redis的scan的命令式却踩了一个坑,顿时发觉自己原来对redis的游标理解的很有限。所以记录下这个踩坑的过程,背景如下:公司因为redis服务器内存吃紧,需要删除一些无用的没有设置过期时间的key。大概有500多w的key。虽然key的数目听起来
Spring缓存是如何实现的?如何扩展使其支持过期删除功能? | 京东云技术团队
我们希望将这些rpc结果数据缓存起来,并在一定时间后自动删除,以实现在一定时间后获取到最新数据。类似Redis的过期时间。接下来是我的调研步骤和开发过程。
燕青 燕青
1年前
Redis桌面管理工具:Redis Desktop Manager for Mac中文版 支持M1
是一款用于管理和操作Redis数据库的桌面应用程序,可以在Mac电脑上轻松进行Redis数据的各种操作,包括创建数据库、添加/删除键、查看数据、执行命令等等。它的界面非常简洁明了,采用了直观的图形用户界面设计,让用户能够轻松地进行各种Redis操作。通过该
胖大海
胖大海
Lv1
故园东望路漫漫,双袖龙钟泪不干。
文章
62
粉丝
3
获赞
28