当前位置: 首页 > news >正文

Redis的过期设置和策略

Redis设置过期时间主要有以下几个配置方式

  • expire key seconds
    设置key在多少秒之后过期
  • pexpire key milliseconds
    设置key在多少毫秒之后过期
  • expireat key timestamp
    设置key在具体某个时间戳(timestamp:时间戳 精确到秒)过期
  • pexpireat key millisecondsTimestamp
    设置key在具体某个时间戳(millisecondsTimestamp:时间戳 精确到毫秒)过期
expire key seconds
127.0.0.1:6379> set p1 2
OK
127.0.0.1:6379> ttl p1
(integer) -1
127.0.0.1:6379> expire p1 10
(integer) 1
127.0.0.1:6379> ttl p1
(integer) 8
pexpire key milliseconds
127.0.0.1:6379> set p2 3
OK
127.0.0.1:6379> pexpire p2 100000
(integer) 1
127.0.0.1:6379> ttl p2
(integer) 96
127.0.0.1:6379> pttl p2
(integer) 90708
expireat key timestamp
127.0.0.1:6379> expireat p3 1746429703
(integer) 1
127.0.0.1:6379> get p3
"2"
127.0.0.1:6379> ttl p3
(integer) 2969
pexpireat key milliseconds
127.0.0.1:6379> set p4 2
OK
127.0.0.1:6379> time
1) "1746426802"
2) "27879"
127.0.0.1:6379> pexpireat p4 1746428802000
(integer) 1
127.0.0.1:6379> ttl p4
(integer) 1964
127.0.0.1:6379> pttl p4
(integer) 1959013
persisit

移除指定键的过期时间

127.0.0.1:6379> get p3
"2"
127.0.0.1:6379> ttl p3
(integer) 2792
127.0.0.1:6379> persist p3
(integer) 1
127.0.0.1:6379> ttl p3
(integer) -1

过期键在持久化(RDB AOF)过程中是如何处理的

RDB

RDB文件分为2个阶段,文件生成阶段和加载阶段。

生成阶段

Redis讲内存中数据持久化成RDB文件的时候,会对key进行过期检查,过期key不会被持久化到RDB文件中,因此Redis的过期键不会对生成RDB文件的时候造成影响。

加载阶段
  • Redis是主服务器运行模式的话,在载入RDB文件的时候,程序会对key进行校验,如果key过期,则不会被加载到内存中。因此过期键不会对载入RDB文件的主服务器造成影响。
  • Redis是从服务器运行模式的话,在载入RDB文件的时候,程序不会对key是否过期进行检验(这是因为 Redis 的过期键删除策略(惰性删除 + 定期删除)仅由主服务器执行),如果key过期了,也会被加载到内存中,当从服务器加载完RDB文件后,会和主服务器进行增量数据同步,如果主服务器上某个键过期被删除,则主服务器会将DEL命令同步到从服务器,此时,从服务器才会删除该键。如果主服务器尚未删除该键(例如键刚过期但未被触发惰性/定期删除),从服务器会继续保留该键,直到主服务器通知删除。如客户端访问从服务器读取到某个key 的时候,会判断key是否过期,如果过期了,返回给客户端nil,但是从服务器不会删除该key(key的删除策略仅由主服务器完成)。
AOF
AOF文件写入

AOF文件写入的时候,如果过期键未被删除的话,则AOF文件中会保留此键,当过期键被删除的时候,AOF文件中会追加DEL命令,来显性的删除过期键。

AOF重写

当发生AOF文件重写的时候,会对Redis中的过期键进行检查,如果键过期,则不会被保存到重写后的AOF文件中。因此不会对AOF重写造成影响

主从库的过期键处理

从库不会进行过期扫描,从库对过期键的过期是被动的,如果从库中的键过期了,如果客户端访问到从库的话,依然可以访问到对应键的值,向未过期键值对一样返回。
从库的过期键依赖主服务器控制,主库key过期会在AOF文件中增加一条DEL命令,同步到从库后,从库通过执行这条DEL命令来删除过期键。

过期执行策略

Redis中维护了一个字典,里面存储了所有设置了过期时间的键值,一般称之为过期字典。
在这里插入图片描述

过期策略

常见的过期策略有三种

  • 定时删除
  • 定期删除
  • 惰性删除
定时删除

在设置键过期时间时,创建一个定时事件,当过期时间到达时,由事件处理器执行键的删除操作。

  • 优点
    保证内存可以尽快释放。
  • 缺点
    在Redis高负载的情况,与大量过期键需要同时处理,会造成Redis服务器的卡顿,影响主业务执行。
定期删除

每隔一段时间检查一次数据库,随机删除一些过期值
Redis默认每秒进行10次的过期扫描,此配置可以通过redis的配置文件redis.conf调整hz的值。

127.0.0.1:6379> config get hz
1) "hz"
2) "10"

Redis每次扫描并不是遍历过期字典的所有键,而是随机抽取的方式判断并删除过期键。
流程如下所示

  1. 从过期字段中随机取出20个键
  2. 判断这20个键中是否有过期键,如果有则删除。
  3. 如果过期键的比例超过了25%,则重复步骤1.

为了保证过期扫描不会由于多次循环导致线程卡死现象,从而影响主业务的执行,Redis设置了扫描的时间上限,默认不会超过25ms
在这里插入图片描述

  • 优点
    采用定期扫描,限制了删除操作的时长和频率,降低了删除操作带来对主业务的影响,同时也能删除一部分过期的key来减少对存储空间的占用。
  • 缺点
    内存清理方面没有定时删除好,对系统资源的占用也没有惰性删除的好。
惰性删除

不主动删除过期键,在获取键的时候判断键是否过期,如果过期则删除key并返回nil。

  • 优点
    每次访问的时候,才会判断键是否过期,所以此方式会很少占用系统资源。
  • 缺点
    这种方式删除不及时,或导致内存利用率低,造成一点的资源浪费
redis采用的策略

redis采用定期删除 + 惰性删除的删除策略。

相关文章:

  • Java后端程序员学习前端之CSS
  • 深入理解 Redis 的主从、哨兵与集群架构
  • 基于EFISH-SCB-RK3576工控机/SAIL-RK3576核心板的网络安全防火墙技术方案‌(国产化替代J1900的全栈技术解析)
  • DeepSeek-Prover-V2,DeepSeek推出的开源数学推理大模型
  • 【Leetcode 每日一题 - 补卡】1128. 等价多米诺骨牌对的数量
  • 旋转图像(中等)
  • 一套SaaS ERP系统源码,ERP成品系统源代码,基于SpringBoot框架
  • 1.CFD 计算过程概述:有限元仿真与CFD介绍
  • Sim Studio 是一个开源的代理工作流程构建器。Sim Studio 的界面是一种轻量级、直观的方式,可快速构建和部署LLMs与您最喜欢的工具连接
  • Android学习总结之GetX库篇(优缺点)
  • 网络延时 第四次CCF-CSP计算机软件能力认证
  • 10.施工测量
  • 基于SpringBoot + Vue 的火车票订票系统
  • opencv+opencv_contrib+cuda和VS2022编译
  • JavaScript学习教程,从入门到精通, jQuery的高亮显示图像、留言板、元素内容操作知识点及案例代码(36)
  • Gradio全解20——Streaming:流式传输的多媒体应用(4)——基于Groq的带自动语音检测功能的多模态Gradio应用
  • 【codeforces 2070c】二分答案详解
  • Google-chrome版本升级后sogou输入法不工作了
  • 动态链接库(DLL)
  • ERP系统源码,有演示,开发文档、数据库文档齐全,支持二次开发
  • “高校领域突出问题系统整治”已启动,聚焦招生、基建、师德等重点
  • 涉“子宫肌瘤”论文现55例男性对照观察患者?山大齐鲁医院:正在调查
  • 听炮检书:柳诒徵1927年的选择
  • 体坛联播|拜仁提前2轮德甲夺冠,赵心童11比6暂时领先
  • 苏丹外交部:苏丹西部一城市约300名平民遭杀害
  • 国内多景区实行一票游多日:从门票经济向多元化“链式经济”转型