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

胖大海
• 阅读 85

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
1年前
Redis之
键值相关命令 1.keys:返回所有符合匹配的key;如:keys \*; 2.exists:确认一个元素是否存在;如:exists name; 3.del:删除一个键,如:del name; 4.expire:设置一个键的过期时间,如:expire addr 10; 5.ttl:返回一个键的过期时间,如果没有过期,就返回剩余的过期时间,如
Stella981 Stella981
1年前
Amazon S3 设置对象的生命周期Lifecycle
保存在S3上面的文件,有些是长期保存的,而有一些我们却不希望保存太久,过一段时间后就可以删除了。例如备份文件,太旧的就要删除;又或如日志文件,只保存某段时间的就行了。 在S3中,可以通过Buckets的Lifecycle生命周期来设置文件对象的过期时间。文件一旦到达其设置的过期时间,就会自动被删除。 我们现创建一个文件夹“temp”,在temp里上传一个
Wesley13 Wesley13
1年前
MySQL 常用命令手册 增删改查大法
一、数据库操作 ------- ### 创建数据库 **语法:** CREATE DATABASE database_name; ### 删除数据库 删除数据库务必谨慎!因为执行删除命令后,所有数据将消失。 **语法:** DROP DATABASE database_name; ### 选择数据库 **语法:**
Stella981 Stella981
1年前
Redis实战
![](https://oscimg.oschina.net/oscnet/6efe009e8d921bf9bbd3c257f6d77bc0fb7.png) Redis 键(key) ============ Redis 键命令用于管理 redis 的键。 DEL key ------- 该命令用于在 key 存在时删除 key。 127.
Stella981 Stella981
1年前
Harbor v2.0 镜像回收那些事
### Harbor 镜像回收流程 Harbor 镜像回收分两部分: * 1、删除镜像 TAG * 2、执行垃圾清理 早期 Harbor 1.0 版本时,`删除镜像TAG`可以通过UI界面手动一个个选取删除,也可以调用官方提供的`SDK`删除(很早以前官方不维护了)。后来官方在 `1.9` 版本提供`TAG保留策略`,解决以
Easter79 Easter79
1年前
Spring集成Day3
一.删除功能 1.拿到要删除的是哪条数据(没有选择,给出提示) 2.如果有选择,给出确定选择(真的要删除嘛) 3.传id到后台进行删除     删除成功 -> 刷新页面     删除失败 -> 给出提示 后台回了一个:JsonResult(boolean success,String msg) 二.添加功能 1 准备弹出框 Ed
Stella981 Stella981
1年前
Redis从入门到放弃系列(七) 过期、内存淘汰策略
Redis从入门到放弃系列(七) 过期、内存淘汰策略 -------------------------- > 本文例子基于:5.0.4 ### 过期策略 Redis对于设置了过期时间的key的过期策略有两种 * 惰性删除 * 定时随机删除 #### 惰性删除 惰性删除的时机在于当你要获取该key的时候再去做判断.这里我以String类型
Wesley13 Wesley13
1年前
centos环境下如何安装Mysql数据库
昨天晚上折腾了一整天,终于在linux环境上安装成功了mysql数据库,首先用命令rpm -qa| grep mysql,查询电脑上是否已经安装了mysql.如果有,如果没有安装,但是有一些相关的依赖包,则删除已经安装的mysql依赖包. 使用rpm -e命令删除。 然后在官网上下载安装包,需要下载两个: MySQL-server-5.6.16-
Stella981 Stella981
1年前
Redis中的Scan命令踩坑记
1 - 原本以为自己对redis命令还蛮熟悉的,各种数据模型各种基于redis的骚操作。但是最近在使用redis的scan的命令式却踩了一个坑,顿时发觉自己原来对redis的游标理解的很有限。所以记录下这个踩坑的过程,背景如下: 公司因为redis服务器内存吃紧,需要删除一些无用的没有设置过期时间的key。大概有500多w的key。虽然key的数目听起来
Stella981 Stella981
1年前
Flink集成iceberg数据湖之合并小文件
* 背景 * 使用 * 流式数据入湖 * 开启压缩程序 * 快照过期 * 删除无用文件 * 数据查询 * 遇到的坑 * 最大并发度问题 * 文件被重复压缩 * 扫描任务读取文件问题 * 不读取大文
胖大海
胖大海
Lv1
故园东望路漫漫,双袖龙钟泪不干。
62
文章
0
粉丝
2
获赞