首页 > 数据库 >Redis 的数据过期了就会马上删除么?

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

时间:2022-10-11 16:46:30浏览次数:58  
标签:key 删除 过期 Redis 时间 设置

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 才过期。

惰性删除

惰性删除很简单,就是当有客户端的请求查询该 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,检查是否过期,如果发现过期了就直接删除。

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

具体步骤如下:

  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 会生成删除的指令记录到 AOF 和 slave 节点

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

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

标签:key,删除,过期,Redis,时间,设置
From: https://www.cnblogs.com/pangdahaiaaa/p/16779710.html

相关文章

  • Redis - 如何 Windows 后台运行 redis-server.exe
    Redis-如何Windows后台运行redis-server.exe?       环境变量   把redis-server.exe安装成windows服务。  redis-server.exe--servic......
  • Redis持久化机制
    一、全量同步与增量同步Redis在不明原因宕机的情况下,数据是不会宕机的。因为数据已持久化。持久化策略分为全量同步与增量同步.1、全量同步(RDB):每天定时(避开高峰期)或者采......
  • Redisson分布式锁
    待到秋风四起时,孤舟远赴倒悬山。官方文档:https://github.com/redisson/redisson使用示例更多请参考官方文档引入依赖<dependency>  <groupId>org.redisson</gro......
  • RedisShake迁移同步工具
    阿里开源项目地址:https://github.com/alibaba/RedisShake程序下载地址:https://github.com/alibaba/RedisShake/releases下载最新程序,里面包含了配置文件https://gith......
  • flinksql读写redis
    0、前言最近有个需求,需要使用flinksql读写redis,由于官网上并没有redis的connector,在网上找了很久,开源的几个connector又没法满足要求,所有这里就自己动手实现了一个。......
  • redis新数据类型Bitmaps基础操作
    1、首先连上你的redis以下一些命令很简单,或者执行命令后效果也无法体现的就没有进行截图展示2、Bitmaps相关操作说明:现在的计算机用二进制(位)作为信息的基础单位,Bitmaps......
  • Linux 下安装Redis
    下载地址:http://redis.io/download,下载最新稳定版本。本教程使用的最新文档版本为2.8.17,下载并安装:1#wgethttp://download.redis.io/releases/redis-6.0.8.tar.gz2......
  • Redis-2
    Redis配置文件在redis根目录提供redis.conf配置文件,如果不使用配置文件,redis会按照默认参数运行网络配置port:指定redis服务使用的端口,默认使用6379bind:配置客户端......
  • docker redis 修改密码
    进入redis[root@iZwz98nzsodcbigjqrrmxmZ~]#dockerexec-itredisbash进入bin目录root@1473acb2f8e7:/data#cd/usr/local/bin/运行命令root@1473acb2f8e7:/us......
  • 阿里云服务器上安装Redis
    阿里云服务器上安装Redis"多学习,多思考"目录阿里云服务器上安装Redis"多学习,多思考"1、下载安装1.1、解压缩1.2、安装C依赖1.3、编译2、修改配置文件3、启动Redis服务4、......