Redis Key的过期策略

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.mzph.cn/news/879466.shtml

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

相关文章

C#命令行参数解析库System.CommandLine介绍

命令行参数 平常在日常的开发过程中,会经常用到命令行工具。如cmd下的各种命令。 以下为sc命令执行后的截图,可以看到,由于没有输入任何附带参数,所以程序并未执行任何操作,只是输出了描述和用法。 系统在创建一个新…

【BFS专题】— 解决最短路问题

1、迷宫中离入口最近的出口 - 力扣(LeetCode) 思路: 利用BFS层序遍历,新建一个变量统计步数代码: class Solution {int dx[] {0, 0, -1, 1};int dy[] {1, -1, 0, 0};public int nearestExit(char[][] maze, int[] en…

URP 线性空间 ui资源制作规范

前言: 关于颜色空间的介绍,可参阅 unity 文档 Color space URP实现了基于物理的渲染,为了保证光照计算的准确,需要使用线性空间; 使用线性空间会带来一个问题,ui资源在unity中进行透明度混合时&#xff…

Centos7 Hadoop 单机版安装教程(图文)

本章教程,主要记录如何在Centos7中安装Hadoop单机版。 一、软件安装包和基础环境 CentOS7.x,jdk8,hadoop 通过网盘分享的文件:Hadoop 链接: https://pan.baidu.com/s/1_qGI9QeXMAJNb3TydHhQGA?pwd=xnz4 提取码: xnz4 当然你也可以自己去官网下载。 java8:https://www.ora…

Redis:发布(pub)与订阅(sub)实战

前言 Redis发布订阅(Pub/Sub)是Redis提供的一种消息传递机制,它使用“发布者-订阅者”(publisher-subscriber)模式来处理消息传递。在这种模式下,发布者将消息发布到一组订阅者中,而无需关心谁…

java的内存分配和回收机制

Java 与 C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 概述 垃圾收集(GC)需要完成的三件事情: 哪些内存需要回收?什么时候回收?如何回收&am…

Linux操作系统入门(三)

_______________________________________________ 一.Linux操作系统的文件结构 相比于Windows操作系统的C,D,E等盘符,Linux操作系统仅有一个"/"符号的根目录. 这其中存在一个显著的不同,Linux操作系统使用的是斜杠"/",而Windows…

基于微信小程序的宠物之家的设计与实现

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的宠物之家/宠物综合…

判断当前环境是否为docker容器下

判断当前环境是否为docker容器下 webshell后或登录到系统后台,判断是否为docker容器可使用如下方法: 方式一:使用ls -alh命令查看是否存在.dockerenv来判断是否在docker容器环境内 ls -alh /.dockerenv如下图无.dockerenv文件,所…

本地部署轻量级web开发框架Flask结合内网穿透公网环境访问管理界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语…

无人机飞手教员组装、调试高级教学详解

随着无人机技术的飞速发展,其在航拍、农业、救援、监测等多个领域的应用日益广泛,对专业无人机飞手的需求也随之增加。作为无人机飞手教员,掌握无人机的高级组装、调试技能不仅是教学的基础,更是培养学生成为行业精英的关键。本教…

【吊打面试官系列-Redis面试题】使用过 Redis 做异步队列么,你是怎么用的?

大家好,我是锋哥。今天分享关于【使用过 Redis 做异步队列么,你是怎么用的?】面试题,希望对大家有帮助; 使用过 Redis 做异步队列么,你是怎么用的? 一般使用 list 结构作为队列,rpus…

Word中插入当前日期与时间

Word中插入当前日期与时间 通过构建基块的方法快速插入当前日期与时间 快捷键操作 快捷键具体功能说明 Alt Shift D 插入当前日期date Alt Shift T 插如当前时间time Ctrl Shift F9 使得域文本变为正常文本 Ctrl F11 锁定域更新域菜单工具会变为黑色 C…

你的大模型应用表现真的好吗?借助 Dify + Langfuse 一探究竟

背景介绍 众所周知,大模型应用的输出存在着一些不确定性,往往需要迭代多轮才能得到较为稳定的输出结果,因此开发者往往需要关注大模型应用的实际表现,并进行有针对性的优化。 然而常规 Web 服务的监控机制往往无法满足大模型应用…

python绘制3d建筑

import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d.art3d import Poly3DCollection# 随机生成建筑块数据 def generate_building_blocks(num_blocks, grid_size100, height_range(5, 50), base_size_range(10, 30)):buildings []for _ in range(…

sqli-labs靶场自动化利用工具——第1关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生,或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢?可能有些人会说不是有sqlmap&#xf…

中国矿业大学《2023年868+2007年自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《25届中国矿业大学868自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2007年复试真题 2023年初试真题 Part1:完整版真题 2007年复试真题 2…

【Python基础】Python错误和异常处理(详细实例)

本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢! 文章目录 一、前言二、Python中的错误类型三、Python异常处理机制3.1 try-except语句3.2 try-except-else语句3.3 try-fi…

TiDB 扩容过程中 PD 生成调度的原理及常见问题丨TiDB 扩缩容指南(一)

导读 作为一个分布式数据库,扩缩容是 TiDB 集群最常见的运维操作之一。本系列文章,我们将基于 v7.5.0 具体介绍扩缩容操作的具体原理、相关配置及常见问题的排查。 通常,我们根据当前资源状态来决定是否需要调整 TiKV 节点的规模&#xff0…

探索螺钉设计:部分螺纹与全螺纹,哪种更适合你的项目?

为什么有些螺钉有部分螺纹? 螺钉由头部、柄部和尖端组成,是世界上zui常用的紧固件之一。与螺栓一样,它们旨在将多个对象或表面连接在一起。但是,在比较不同类型的螺钉时,您可能会注意到其中一些都具有部分螺纹杆。 什么是螺柄&a…