Redis Key的过期策略

news/2024/9/18 4:49:57/ 标签: 分布式, Java, 后端, 微服务, 架构, redis

Redis 的过期策略主要是指管理和删除那些设定了过期时间的键,以确保内存的有效使用和数据的及时清理。 具体来说,Redis 有三种主要的过期策略:定期删除(Scheduled Deletion)、惰性删除(Lazy Deletion)和内存淘汰策略(Eviction Policies)。

Redis 过期策略

1. 定期删除

Redis 的定期删除策略(Scheduled Deletion)的步骤如下:

  1. 设置定期任务

    • Redis 会在后台线程中设置一个定期任务,用于扫描和删除过期键。这个任务会在特定的时间间隔内执行,默认每 100 毫秒运行一次。
  2. 随机抽样检查

    • 在每次定期任务执行时,Redis 会从已设置过期时间的键中随机抽取一部分键进行检查,而不是一次性检查所有键。这样可以减少对 CPU 的负载。
  3. 检查键的过期状态

    • 对于抽取的每一个键,Redis 会检查该键的过期时间。如果发现某个键已经过期,Redis 就会立即删除该键。
  4. 重复检查

    • 如果在一次扫描中发现了删除的健的占比超过了设置的阈值(比如:25%),那么 Redis 会继续进行下一轮的随机抽样检查,直到在一次扫描中没有找到任何过期的键为止。
  5. 调节扫描频率和负载

    • 为了防止定期删除任务占用过多的 CPU 资源,Redis 会根据上一次扫描中删除的过期键的数量来动态调整下一次扫描的强度。比如,如果上一次扫描删除了大量的过期键,那么下一次扫描的键数量可能会减少,反之亦然。

2. 惰性删除

Redis 的惰性删除策略(Lazy Deletion)的步骤如下:

  1. 访问键时检查过期状态

    • 当客户端对 Redis 发起读操作(如 GET)或写操作(如 SET)时,Redis 首先会检查被访问的键是否设置了过期时间。
  2. 获取当前时间

    • Redis 获取当前的系统时间,用来与键的过期时间进行比较。
  3. 比较过期时间

    • 如果键的过期时间早于当前时间,说明该键已经过期。
  4. 删除过期键

    • 如果键已经过期,Redis 会立即删除该键,并返回一个特殊的响应(如返回 nil 表示键不存在,或其他与操作类型相关的结果)。
  5. 处理未过期键

    • 如果键未过期,Redis 会继续正常处理客户端的请求,返回键的值或执行相应的写操作。

示例

假设客户端向 Redis 发起一个 GET 操作来读取键 mykey 的值,惰性删除的详细步骤如下:

  1. 客户端发送 GET mykey

    • 客户端向 Redis 发送 GET mykey 命令。
  2. Redis 接收请求并查找键

    • Redis 接收到请求后,查找键 mykey
  3. 检查过期时间

    • Redis 发现 mykey 设置了过期时间,获取当前时间。
  4. 比较当前时间和过期时间

    • Redis 比较当前时间和 mykey 的过期时间。
      • 如果 mykey 的过期时间是 2024-06-01 12:00:00,当前时间是 2024-06-01 12:01:00,则 mykey 已经过期。
      • 如果当前时间是 2024-06-01 11:59:00,则 mykey 未过期。
  5. 删除过期键或返回值

    • 如果 mykey 已经过期,Redis 立即删除 mykey,并返回 nil 表示键不存在。
    • 如果 mykey 未过期,Redis 返回 mykey 的值。

3. 内存淘汰

Redis 的内存淘汰策略(Eviction Policies)是指当 Redis 实例的内存使用达到配置的最大上限时,采取的一系列措施来删除现有的键,以腾出空间给新的数据。

以下是 Redis 内存淘汰策略的详细说明:

删除策略

1. volatile-lru(使用 LRU 算法删除设置了过期时间的键)

  • 描述:从设置了过期时间的键中,使用 LRU(Least Recently Used,最近最少使用)算法删除最不常用的键。
  • 应用场景:适用于需要在有过期时间的键中保持最常用的数据的情况。

2. allkeys-lru(使用 LRU 算法删除所有键)

  • 描述:从所有键中,使用 LRU 算法删除最不常用的键。
  • 应用场景:适用于希望在所有数据中保持最常用的数据的情况,而不考虑键是否设置了过期时间。

3. volatile-random(随机删除设置了过期时间的键)

  • 描述:从设置了过期时间的键中,随机删除键。
  • 应用场景:适用于希望简单地随机删除有过期时间的键,以释放内存的情况。

4. allkeys-random(随机删除所有键)

  • 描述:从所有键中,随机删除键。
  • 应用场景:适用于希望简单地随机删除键,以释放内存的情况。

5. volatile-ttl(删除设置了过期时间且剩余存活时间最短的键)

  • 描述:从设置了过期时间的键中,删除剩余存活时间(TTL,Time to Live)最短的键。
  • 应用场景:适用于希望首先删除那些即将过期的键,以尽量保留长时间有效数据的情况。

6. noeviction(不删除任何键)

  • 描述:当内存使用达到上限时,不删除任何键,直接返回错误。
  • 应用场景:适用于希望严格控制内存使用,不希望自动删除任何键的情况。通常用于希望 Redis 只作为缓存或持久存储的一部分,并在达到内存上限时明确地处理错误。

具体操作步骤

以下是 Redis 内存淘汰策略的具体操作步骤:

  1. 达到内存上限

    • Redis 实例的内存使用达到配置的最大上限(由配置参数 maxmemory 设置)。
  2. 选择淘汰策略

    • Redis 根据配置的淘汰策略(由 maxmemory-policy 参数设置)来决定如何释放内存。
  3. 执行淘汰策略

    • 根据选定的策略,Redis 选择要删除的键:
      • LRU 算法:Redis 使用近似 LRU 算法,维护一个候选键列表,并删除最不常用的键。
      • 随机删除:Redis 从符合条件的键中随机选择并删除。
      • TTL 最短:Redis 删除剩余存活时间最短的键。
      • 无淘汰:Redis 不删除键,直接返回错误(如 OOM command not allowed)。
  4. 释放内存

    • 删除选中的键,释放内存。
  5. 继续处理请求

    • 如果删除的键足以腾出足够的空间,Redis 继续处理客户端请求;否则,重复执行淘汰策略,直到满足内存要求或返回错误。

示例

假设 Redis 配置了 maxmemory 为 100MB,maxmemory-policy 为 allkeys-lru,当前内存使用已达到 100MB:

  1. 客户端发送 SET mykey value

    • Redis 接收到 SET mykey value 请求。
  2. 检测内存使用

    • Redis 发现内存使用已达上限,触发淘汰策略。
  3. 选择淘汰策略 allkeys-lru

    • Redis 使用 LRU 算法,从所有键中选择最不常用的键。
  4. 删除最不常用的键

    • Redis 删除 LRU 列表中的最不常用键,如 oldkey1 和 oldkey2
  5. 释放内存并处理请求

    • 删除键后释放足够内存,Redis 继续处理 SET mykey value 请求,并成功存储新键 mykey

4. 三种策略相互配合

配合工作

  1. 正常情况下

    • 定期删除 和 惰性删除 是主要的过期数据清理手段。
    • 定期删除在后台自动清理一部分过期键,减少内存占用。
    • 惰性删除确保每次访问时,过期键都能被及时清理,保证数据的有效性。
  2. 内存压力增大时

    • 当内存使用达到配置的最大上限时,触发 内存淘汰策略
    • 内存淘汰策略根据配置的策略(如 LRU、随机删除等)选择并删除部分键,以释放内存。
    • 在这种情况下,定期删除和惰性删除继续工作,但主要任务是由内存淘汰策略来完成。
  3. 高效配合

    • 定期删除和惰性删除保证大部分过期键能够在不影响系统性能的情况下被清理。
    • 内存淘汰策略则在内存压力过大时提供额外的保护,确保系统不会因为内存不足而出现问题。
    • 这种多层次的内存管理机制,保证了 Redis 的高效和稳定运行。

示例场景

假设 Redis 实例设置了 maxmemory 为 100MB,淘汰策略为 allkeys-lru

  1. 系统正常运行

    • 定期删除任务每 100 毫秒运行一次,随机检查一些设置了过期时间的键,删除过期键。
    • 客户端访问键时,惰性删除机制检查键是否过期,过期键立即删除。
  2. 内存使用达到 90MB

    • 定期删除和惰性删除继续工作,但由于某些键没有被及时访问或定期任务未覆盖,内存使用仍在增长。
  3. 内存使用达到 100MB

    • 触发内存淘汰策略 allkeys-lru,Redis 删除最近最少使用的键,释放内存。
    • 继续接受并处理新的客户端请求,确保系统正常运行。

关于ArchManual

https://archmanual.com

https://github.com/yingqiangh/ArchManual


http://www.ppmy.cn/news/1526046.html

相关文章

在Excel里制作简单游戏界面

生成随机激活码 找工具箱 插入按钮 建宏 方法一:新建按钮的时候创建宏 方法二:右键->指定宏 VBA VBA代码界面 调整字体 VBA代码 Public str As String 存储激活码显示的字符 Public st As String 中间变量,用来替代随机数 Public ot…

连锁管理系统如何兼批发和零售 连锁收银系统如何配合做好财务

在现代零售环境中,信息化管理系统对连锁企业的运营至关重要。连锁管理系统通过先进的信息技术解决了批发和零售中的众多挑战,同时为财务管理提供了有力支持。商淘云分享如何提高连锁企业的运营效率和财务管理水平,大家点赞收藏。 1、统筹批发…

python-游戏自动化(二)(OpenCV图像运用基础)

OpenCV OpenCV简介 首先我们来了解一下,OpenCV是什么? OpenCV 是计算机视觉中经典的专用库,其支持多语言、跨平台,功能强大。 OpenCV现在支持与计算 机视觉和机器学习有关的多种算法,并且正在日益扩展…

限流,流量整形算法

写在前面 源码 。 本文看下流量整形相关算法。 目前流量整形算法主要有三种,计数器,漏桶,令牌桶。分别看下咯! 1:计数器 1.1:描述 单位时间内只允许指定数量的请求,如果是时间区间内超过指…

苹果宣布iOS 18正式版9月17日推送:支持27款iPhone升级

9月10日消息,在苹果秋季发布会结束后, 苹果宣布将于9月17日(下周二)推送iOS 18正式版系统。 苹果官网显示,iOS 18正式版将兼容第二代iPhone SE及之后的所有机型,加上刚发布的iPhone 16系列,共兼容27款iPhone。 iOS 18升…

C++多态讲解

多态 多态的概念 通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)这里重点讲运行时多态。 运行时多态 运行时多态,具体点就是去完成某个行为(函数),可以传不同的对象就会完成不同的行为,就达到多种形…

Spring事务传播行为详解

在Spring框架中,事务管理是一个至关重要的部分,它确保了数据的一致性和完整性。Spring提供了灵活的事务传播行为,允许开发者根据具体场景选择不同的事务管理方式。本文将详细介绍Spring的七种事务传播行为,并通过示例代码来展示它…

RTCP协议

一、常用RTCP数据包类型 类型缩写表示解释200SR(Sender Report)发送端报告201RR(Receiver Report)接收端报告202SDES(Source Description Items)源点描述203BYE结束传输204APP特定应用 (一般&a…

Acwing 区间合并

区间合并 主要思想:给定很多区间。若两个区间有交集,将二者合并成一个区间。 具体做法: 先按照区间的左端点进行排序然后遍历每个区间,根据不同的情况进行合并,有一下几种情况: 第一种情况,区间不变&…

【Scala入门学习】Scala的方法和函数

1. 方法 在scala中的操作符都被当成方法存在,比如说、-、*、/ 12就是1.(2)的调用, 2.0 是doule类型,强调用Int类型的写法为1.(2:Int) 1.1 方法的声明和使用 定义方法的语法: def 方法名([变量:变量类型&#xff…

C++竞赛初阶L1-15-第六单元-多维数组(34~35课)556: T456506 矩阵转置

题目内容 输入一个 n 行 m 列的矩阵 A,输出它的转置 AT。 输入格式 第一行包含两个整数 n 和 m,表示矩阵 A 的行数和列数。1≤n≤100,1≤m≤100。 接下来 n 行,每行 m 个整数,表示矩阵 A 的元素。相邻两个整数之间用单个空格隔开,每个元素均在 1∼1000 之间。 输出格…

移动订货小程序哪个好 批发订货系统源码哪个好

订货小程序就是依托微信小程序的订货系统,微信小程序订货系统相较于其他终端的订货方式,能够更快进入商城,对经销商而言更为方便。今天,我们一起盘点三个主流的移动订货小程序,看看哪个移动订货小程序好。 第一、核货宝…

【MyBatis---快速学习和复习】

学习视频(强推):【MyBatis视频零基础入门到进阶,MyBatis全套视频教程源码级深入详解】 https://www.bilibili.com/video/BV1JP4y1Z73S/?p134&share_sourcecopy_web&vd_source4d877b7310d01a59f27364f1080e3382 MyBatis中…

Go语言错误处理详解

Go语言以其简洁、高效和并发能力著称。在实际开发中,错误处理是一个不可避免且至关重要的部分。本文将深入探讨Go语言中的错误处理机制,涵盖其原理、使用方法、最佳实践,并提供丰富的代码示例和中文注释。 一、错误处理的基本概念 在Go语言…

STL02——手写简单版本的list

手写一个简单版本的list 设计一个名为 List 的 List 类,该类具有以下功能和特性: 1、基础成员函数 构造函数:初始化 List 实例析构函数:清理资源,确保无内存泄露 2、核心功能 在 List 末尾添加元素在 List 开头添…

【Gateway】网关服务快速上手

微服务的接口都是直接对外暴露的,可以直接通过外部访问,为了保证对外服务的安全性服务端实现的微服务接口通常都带有一定的权限校验机制,由于使用了微服务,原本一个应用的的多个模块拆分成了多个应用,我们不得不实现多次校验逻辑,当这套逻辑需要修改时,我们需要修改多个应用,加…

数据脱敏 (Jackson + Hutool 工具包)

一、简介 系统使用 Jackson 序列化策略,对标注了 Sensitive 注解的属性进行脱敏处理 基于Hutool 脱敏案列: Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) JacksonAnnotationsInside// 表示只对有此注解的字段进行序列化 JsonSeriali…

【超详细】Plaxis软件简介、 Plaxis Python API环境搭建、自动化建模、Python全自动实现、典型岩土工程案例实践应用

查看原文>>>【案例教程】PLAXIS软件丨自动化建模、典型岩土工程案例解析、模型应用、数据分析、图表制作 目录 第一部分:Plaxis软件简介及 Plaxis Python API环境搭建 第二部分:Plaxis自动化建模-基础案例 第三部分:进阶案例-Pyt…

neo4j docker 运行4.35 community 版本失败

运行脚本 sudo docker run -d \ --name container_name \ -p 27474:7474 \ -p 27687:7687 \ -v /home/neo4j/data:/data \ -v /home/neo4j/logs:/logs \ -v /home/neo4j/conf:/var/lib/neo4j/conf \ -v /home/neo4j/import:/var/lib/neo4j/import \ -v /home/lighthouse/tcmkg…

redis常见的数据类型?

参考:一文读懂Redis五种数据类型及应用场景 - 知乎 (zhihu.com) String 类型 String 类型:Redis 最基本的数据类型,它是二进制安全的,意味着你可以用它来存储任何类型的数据,如图片、序列化对象等。使用场景&#xff…