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采用定期删除 + 惰性删除的删除策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vite:npm 安装 pdfjs-dist , PDF.js View 预览功能示例

pdfjs-dist 是 Mozilla 的 PDF.js 库的预构建版本,能让你在项目里展示 PDF 文件。下面为你介绍如何用 npm 安装 pdfjs-dist 并应用 pdf.js 和 pdf.worker.js。 为了方便,我将使用 vite 搭建一个原生 js 项目。 1.创建项目 npm create vitelatest pdf-v…

【Android】动画原理解析

一,基础动画 基础动画,有四种,分别是平移(Translate)、缩放(Scale)、Rorate(旋转)、Alpha(透明度),对应Android中以下四种。 1,Animation基类 1,基本概念 1,插值器 插值器的作用,是控制动画过程的参数,可以理解为 时间(t)与动画进程(d)的函数,动画仅…

手撕基于AMQP协议的简易消息队列-2(所用第三方库的介绍与简单使用)

第三方库的介绍 Protobuf 什么是Protobuf(Protocol Buffer)? Protobuf是数据结构序列化和反序列化框架 Protobuf的特点有哪些? 通用性:语⾔⽆关、平台⽆关。即 ProtoBuf ⽀持 Java、C、Python 等多种语⾔&#xf…

Altera系列FPGA实现图像视频采集转HDMI/LCD输出,提供4套Quartus工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目Altera系列FPGA相关方案推荐 3、设计思路框架工程设计原理框图输入Sensor之-->OV7725摄像头输入Sensor之-->OV5640摄像头输入Sensor之-->串口传图输入图像缓…

ABP vNext 集成 CAP + RabbitMQ 实现可靠事件总线

🚀 ABP vNext 集成 CAP RabbitMQ 实现可靠事件总线 在分布式系统中,事件总线是实现服务解耦与最终一致性的核心手段。本文将以 ABP vNext 8.1 为基础,手把手教你如何集成 CAP RabbitMQ 构建可靠的事件驱动架构。 🎯 本文适用于…

Linux 服务器静态 IP 配置初始化指南

✅ 第一步:确认网络管理方式 运行以下命令判断系统使用的网络管理服务: # 检查 NetworkManager 是否活跃 systemctl is-active NetworkManager# 检查 network(旧服务)是否活跃 systemctl is-active network或者检查配置路径&…

C++ 工具链与开发实践:构建安全、高效与创新的开发生态

引言 在 C 的技术演进中,工具链的革新与开发实践的迭代始终是推动语言生命力的核心动力。从内存安全的攻防体系到嵌入式设备的能效优化,从跨平台开发的降本增效到开发者社区的生态构建,C 正通过工具链与方法论的双重升级,应对复杂…

跨浏览器自动化测试的智能生成方法

一、背景与挑战:跨浏览器测试为什么“难”? 在现代Web应用开发中,跨浏览器兼容性是用户体验的底线保障。面对Chrome、Firefox、Safari、Edge乃至IE、移动浏览器等多种运行环境,开发者与测试人员常面临: 相同DOM在不同…

【Hive入门】Hive安全管理与权限控制:用户认证与权限管理深度解析

目录 引言 1 Hive安全管理体系概述 2 Hive用户认证机制 2.1 Kerberos集成认证 2.1.1 Kerberos基本原理 2.1.2 Hive集成Kerberos配置步骤 2.1.3 Kerberos认证常见问题排查 2.2 LDAP用户同步 2.2.1 LDAP协议概述 2.2.2 Hive集成LDAP配置 2.2.3 LDAP与Hive用户同步架构…

0X. Linux嵌入式系统(课堂笔记)

目录 一. 开发板桥接 二. 开发板白屏 三. 0324-MPU6050开发 3.1 函数详解 3.2 常用 ioctl 请求码(request) 3.3 头文件详解 四. 获取鼠标信息 4.1 获取鼠标信息 4.2 内核修改并编译 五. QT基础使用 六. 内核打印Hello world 七. 内核GPIO …

qml中的TextArea使用QSyntaxHighlighter显示高亮语法

效果图,左侧显示行号,右侧用TextArea显示文本内容,并且语法高亮。 2025年5月8号更新 1、多行文本注释 多行文本注释跟普通的高亮规则代码不太一样,代码需要修改,这里以JavaScript举例。 先制定多行文本注释规则&…

【Python从入门到精通】--‘@‘符号的作用

在Python中,符号主要有三种用途:装饰器(Decorator)、矩阵乘法运算符(Python 3.5)以及类型提示中的修饰符(如typing)。 目录 1.--装饰器(Decorator) 2.--矩…

VAE和Stable Diffusion的关系

文章目录 ✅ 简单回顾:什么是 VAE?🔄 Stable Diffusion 和 VAE 的关系:🎯 编码器:💥 解码器: 🤔 那 Stable Diffusion 本身是 VAE 吗?🧠 简要对比…

PyTorch_点积运算

点积运算要求第一个矩阵 shape:(n, m),第二个矩阵 shape: (m, p), 两个矩阵点积运算shape为:(n,p) 运算符 用于进行两个矩阵的点乘运算torch.mm 用于进行两个矩阵点乘运算,要求输入的矩阵为3维 (mm 代表 mat, mul)to…

02_JVM

1、JVM虚拟机组成及内存分配 三大部分: 类装载子系统JVM虚拟机字节码执行引擎 其中,JVM虚拟机运行时数据区(内存模型)包含五部分:堆、栈(线程)、方法区(元空间)、本地…

基于FPGA控制PCF8591开展ADC采样,以采样烟雾模块输出模拟电压为例(IIC通信)

基于FPGA控制PCF8591开展ADC采样 前言一、芯片手册阅读1.设备地址2.字节地址3.IIC通信协议 二、仿真分析三、代码分析总结视频演示 前言 这段时间做设计总是遇到一些传感器模块输出模拟电压,采集模拟电压进而了解传感器输出的浓度占比,在淘宝上找到了一…

在Python和C/C++之间共享std::vector<std::vector<int>>数据

在Python和C/C之间共享std::vector<std::vector>数据 在Python和C/C之间共享嵌套向量数据(std::vector<std::vector<int>>)可以通过几种方法实现。以下是几种常见的方法&#xff1a; 方法1: 使用Cython Cython是连接Python和C的很好选择&#xff0c;它可以…

Linux NVIDIA 显卡驱动安装指南(适用于 RHEL/CentOS)

&#x1f4cc; 一、禁用 Nouveau 开源驱动 NVIDIA 闭源驱动与开源的 nouveau 驱动冲突&#xff0c;需先禁用&#xff1a; if [ ! -f /etc/modprobe.d/blacklist-nouveau.conf ]; thenecho -e "blacklist nouveau\noptions nouveau modeset0" | sudo tee /etc/modpr…

Python爬虫实战:获取千库网各类素材图片,为设计师提供参考

一、引言 在当今设计领域,丰富的素材积累对设计师而言至关重要。千库网作为一个素材资源丰富的平台,拥有海量的各类素材图片。然而,手动从该网站收集素材不仅耗时,而且效率低下。Python 作为一种功能强大的编程语言,具备丰富的库和工具,可用于开发高效的爬虫程序。通过 …

vue截图-html2canvas

使用html2canvas进行截图操作 在 Vue 中使用 ​​html2canvas​​ 将 HTML 元素&#xff08;如包含贝塞尔曲线的 Canvas/SVG&#xff09;转换为图片 下载html2canvas npm install html2canvas在页面中使用&#xff0c;要截取哪个div的内容&#xff0c;先给这个div加一个ref标…