Redis篇 Redis如何清理过期的key以及对应的解决方法

devtools/2025/2/3 15:47:40/

 Redis设置Key过期时间

在 Redis 中,可以通过特定的命令为 Key 设置过期时间,使得 Key 在一定时间后自动删除,这对于管理缓存、验证码等临时数据非常有用。


解决方法

1. Redis过期删除策略

1.1 如何实现过期策略

对一个 key 设置了过期时间时,Redis 会把该 key 带上过期时间存储到一个过期字典中,字典保存了数据库中所有 key 的过期时间


1.2 如何实现删除策略

1.2.1 常见的三种过期删除策略

  1. 定时删除:指在指定的时间点自动删除某些内容或文件。

  2. 惰性删除:可能指的是一种被动或延迟的删除方式,即在某些条件下或触发某些事件后才进行删除。

  3. 定期删除:指按照一定的时间间隔(如每天、每周等)自动删除某些内容或文件。


1.2.2 Redis 使用的过期删除策略

惰性删除:

  1. 客户端

    • 这是流程的起点,表示用户或应用程序发起了一个请求。

  2. 请求 key

    • 客户端请求一个特定的数据项,这个数据项通过一个唯一的标识符(key)来标识。

  3. 是否过期

    • 这是一个决策点,系统需要检查请求的 key 是否已经过期。这通常涉及到检查 key 的有效期限或最后访问时间。

  4. 是(删除 key)

    • 如果 key 已经过期,流程进入这一分支。系统将执行删除操作,移除这个过期的 key 及其关联的数据。

  5. 返回 null

    • 删除操作完成后,系统向客户端返回一个 null 值,表示请求的数据项已被删除,不再可用。

  6. 结束

    • 流程结束,客户端接收到 null 值后,可以进行相应的处理,如提示用户数据已过期或删除。

  7. 否(返回数据)

    • 如果 key 没有过期,流程进入这一分支。系统将检索并返回与该 key 关联的数据。

  8. 结束

    • 流程结束,客户端接收到请求的数据,可以进行进一步的处理或显示。

也就是说删除操作是在数据被请求时才进行的,而不是预先计划的。这种策略可以减少不必要的删除操作,只有在数据确实不再需要时才进行删除


定时删除:

  1. 开始

    • 这是流程的起点,表示定期删除过程的开始。

  2. 过期字典随机抽取

    • 在这一步,系统从存储过期数据的字典中随机抽取一部分数据进行处理。

  3. 删除过期 key

    • 系统检查抽取的数据中哪些 key 已经过期,并执行删除操作。

  4. 执行时间上限

    • 这是一个决策点,系统检查删除操作的执行时间是否超过了预设的时间上限。

    • 如果执行时间超过了上限,流程将跳转到“结束”步骤,以避免过长的删除操作影响系统性能。

  5. 过期 key 超过 25%

    • 另一个决策点,系统检查被抽取的数据中过期的 key 是否超过了 25%。

    • 如果过期的 key 超过了 25%,说明有大量的数据需要删除,流程将返回到“过期字典随机抽取”步骤,继续处理更多的数据。

    • 如果过期的 key 没有超过 25%,流程将进入“结束”步骤。

  6. 结束

    • 这是流程的终点,表示定期删除过程的结束。

也就是说删除操作是按照一定的周期进行的,而不是在数据被请求时才进行。这种策略有助于系统定期清理过期数据,保持系统的整洁和性能。


2. Redis内存淘汰策略

  1. noeviction(不淘汰数据)

    • 当内存不足以容纳新写入数据时,Redis将拒绝执行写入操作(如SET、LPUSH等)。

    • 这种策略不会主动删除任何数据,适用于对数据完整性要求非常高的场景。

  2. 进行数据淘汰

    • 当内存不足以容纳新写入数据时,Redis将根据配置的淘汰策略来删除一些数据以释放内存。

    • 这种策略适用于需要动态调整内存使用的场景。

  3. 存在过期时间数据

    • 这类数据是指设置了过期时间的键(key),Redis可以对这类数据应用以下几种淘汰策略:

      • volatile-random:从设置了过期时间的键中随机选择一些进行删除。

      • volatile-ttl:从设置了过期时间的键中选择即将过期的键进行删除。

      • volatile-lru(Least Recently Used):从设置了过期时间的键中选择最近最少使用的键进行删除。

      • volatile-lfu(Least Frequently Used):从设置了过期时间的键中选择使用频率最低的键进行删除。

  4. 所有数据

    • 这类数据是指所有存储在Redis中的键,包括设置了过期时间和未设置过期时间的键。Redis可以对这类数据应用以下几种淘汰策略:

      • allkeys-random:从所有键中随机选择一些进行删除。

      • allkeys-lru:从所有键中选择最近最少使用的键进行删除。

      • allkeys-lfu:从所有键中选择使用频率最低的键进行删除。

通过这些策略,Redis可以在内存达到最大限制时,根据实际需求和数据的重要性灵活地选择哪些数据应该被删除,以确保系统的稳定性和性能。


http://www.ppmy.cn/devtools/155759.html

相关文章

DeepSeek-R1本地部署实践

一、下载安装 --Ollama Ollama是一个开源的 LLM(大型语言模型)服务工具,用于简化在本地运行大语言模型,降低使用大语言模型的门槛,使得大模型的开发者、研究人员和爱好者能够在本地环境快速实验、管理和部署最新大语言…

Effective Objective-C 2.0 读书笔记—— 方法调配(method swizzling)

Effective Objective-C 2.0 读书笔记—— 方法调配(method swizzling) 文章目录 Effective Objective-C 2.0 读书笔记—— 方法调配(method swizzling)前言IMP**SEL 和 IMP 在 objc_msgSend 中的关系** 方法调配实现方法交换 用于…

7 Spark 底层执行原理

7 Spark 底层执行原理 1. 从代码角度看 DAG 图的构建2. 将 DAG 划分为 Stage 核心算法3. 将 DAG 划分为 Stage 剖析4. 提交 Stages5. 监控 Job、Task、Executor6. 获取任务执行结果7. 任务调度总体诠释Spark 运行架构特点 Spark 运行流程 Spark运行流程 具体运行流程如下&…

ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务

目录 一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务 1. app.Services 2. GetRequiredService() 3. Init() 二、应用场景 三、依赖注入使用拓展 1、使用场景 2、使用步骤 1. 定义服务接口和实现类 2. 注册服务到依赖注入容器 3. 使用依赖注入获取并…

14 2D矩形模块( rect.rs)

一、 rect.rs源码 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENS…

TypeScript语言的语法糖

TypeScript语言的语法糖 TypeScript作为一种由微软开发的开源编程语言&#xff0c;它在JavaScript的基础上添加了一些强类型的特性&#xff0c;使得开发者能够更好地进行大型应用程序的构建和维护。在TypeScript中&#xff0c;不仅包含了静态类型、接口、枚举等强大的特性&…

计算机毕业设计Python动漫推荐系统 漫画推荐系统 动漫视频推荐系统 机器学习 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

vim的多文件操作

[rootxxx ~]# vim aa.txt bb.txt cc.txt #多文件操作 next #下一个文件 prev #上一个文件 first #第一个文件 last #最后一个文件 快捷键: ctrlshift^ #当前和上个之间切换 说明&#xff1a;快捷键ctrlshift^&#xff0c…