Redis的过期策略与内存淘汰机制详解

文章目录

    • Redis的过期策略
      • 1. 定时删除
      • 2. 惰性删除
      • 3. 定期删除
    • Redis的内存淘汰机制
      • 1. noeviction
      • 2. volatile-random
      • 3. volatile-ttl
      • 4. volatile-lru
      • 5. volatile-lfu
      • 6. allkeys-random
      • 7. allkeys-lru
      • 8. allkeys-lfu
    • LRU与LFU算法
    • 总结

Redis作为一种高性能的键值对存储系统,广泛应用于缓存、消息中间件等多种场景。然而,Redis的内存是有限的,当内存达到上限时,就需要通过过期策略和内存淘汰机制来管理数据,确保系统的稳定运行。本文将详细介绍Redis的过期策略及内存淘汰机制。

Redis的过期策略

Redis提供了三种主要的过期策略来处理数据的过期问题:定时删除、惰性删除和定期删除。每种策略都有其优缺点,Redis在实际使用中通常会将定期删除和惰性删除结合使用,以达到最优的性能和资源利用。

1. 定时删除

定时删除策略为每个设置了过期时间的key创建一个定时器,当key过期时立即删除。这种策略的优点是可以立即释放内存,对内存友好;但其缺点也非常明显,会占用大量的CPU资源去处理过期数据,从而影响缓存的响应时间和吞吐量。因此,Redis默认不采用这种策略。

2. 惰性删除

惰性删除策略不主动删除key,而是在每次读写操作之前检查key是否过期,如果过期则删除。这种策略的优点是CPU处理次数少,只有访问到过期key时才会进行删除操作;但其缺点是如果大量key过期而长时间未被访问,则会占用大量内存。

3. 定期删除

定期删除策略是定时删除和惰性删除的一个折中方案。Redis默认会每秒进行十次过期扫描(100ms一次),但并不是遍历所有设置了过期时间的key,而是随机选择一部分key进行检查,如果过期则删除。这种策略既节省了CPU资源,又避免了内存浪费,是Redis推荐的过期处理策略。

Redis的内存淘汰机制

当Redis的内存使用达到maxmemory限制时,就需要通过内存淘汰机制来释放内存空间。Redis 4.0之后,提供了8种内存淘汰策略供用户选择。

1. noeviction

默认策略,不进行数据淘汰,当内存达到maxmemory时,拒绝所有写入操作并返回错误信息。这种策略适用于不希望丢失任何数据的场景,但会限制Redis的写入能力。

2. volatile-random

在设置了过期时间的键值对中,随机移除某个键值对。适用于对过期数据没有特殊要求的场景。

3. volatile-ttl

在设置了过期时间的键值对中,移除即将过期的键值对(ttl最小的)。这种策略可以优先释放即将过期的数据,但可能不是最优的淘汰选择。

4. volatile-lru

在设置了过期时间的键值对中,移除最近最少使用的键值对。这是最常见的淘汰策略之一,适用于缓存场景。

5. volatile-lfu

在设置了过期时间的键值对中,移除最近最不频繁使用的键值对。适用于需要频繁访问热数据的场景。

6. allkeys-random

在所有键值对中,随机移除某个键值对。这种策略较为简单,但可能导致重要数据被误删除。

7. allkeys-lru

在所有键值对中,移除最近最少使用的键值对。与volatile-lru类似,但适用于所有数据,不仅仅是设置了过期时间的数据。

8. allkeys-lfu

在所有键值对中,移除最近最不频繁使用的键值对。与volatile-lfu类似,但适用于所有数据。

LRU与LFU算法

LRU(Least Recently Used)和LFU(Least Frequently Used)是Redis内存淘汰机制中最常用的两种算法。

  • LRU算法:通过维护一个双向链表,记录每个数据项最近一次被访问的时间。当内存达到上限时,优先淘汰最长时间未被访问的数据项。
  • LFU算法:通过记录每个数据项被访问的次数,当内存达到上限时,优先淘汰最近一段时间内被访问次数最少的数据项。

Redis在实现这两种算法时,为了优化性能,采用了近似的算法,而不是严格的LRU或LFU算法。

总结

Redis的过期策略和内存淘汰机制是确保系统稳定运行和高效利用内存的重要手段。通过合理选择过期策略和内存淘汰策略,可以在不同场景下达到最优的性能和资源利用效果。在实际应用中,建议根据具体业务需求和系统环境来选择合适的策略,以最大化Redis的性能和稳定性。

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

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

相关文章

OJ-0813

题目 示例&#xff1a; 输入&#xff1a; 1-2abcd 输出&#xff1a; -1参考 import java.util.Arrays; import java.util.HashSet; import java.util.Scanner; import java.util.Set; import java.util.Stack;public class Main {// 保存数字的栈static Stack<Long> nu…

Qt使用lupdate工具生成.ts文件

Qt提供了lupdate工具&#xff0c;用于从源代码中提取需要翻译的字符串【1】&#xff0c;并生成或更新.ts文件 注解【1】&#xff1a;使用tr()函数&#xff08;或者QCoreApplication::translate()等其他相关的翻译函数&#xff09;来标记所有需要翻译的文本。例如&#xff1a; …

WEB应用(十五)---文件包含

文件包含的概念 在各种开发语言中都提供了内置的文件包含函数&#xff0c;可以使得开发人员在一个代码文件中直接包含&#xff08;引入&#xff09;另外一个代码文件。 由于文件包含可以达到复用和方便修改的目的&#xff0c;在代码设计中常常使用。 大多数情况下&#xff0…

Ethercat学习-SOEM主站源码解析(DC部分)

文章目录 SOEM DC模式源码简介示例用图ecx_porttimeecx_parentportecx_configdc如果从站不支持DC如果从站支持DC SOEM DC模式源码简介 示例用图 本文中都会围绕着这个图来讲&#xff0c;从站的port编号依次为0&#xff0c;3&#xff0c;1&#xff0c;2 在SOEM中&#xff0c;与…

【vulnhub】Broken: Gallery靶机

靶机安装 下载地址&#xff1a;Broken: Gallery ~ VulnHub 信息收集 靶机IP发现 nmap 192.168.93.0/24 端口扫描 nmap -A 192.168.93.167 -p- 目录扫描 dirsearch -u http://192.168.93.167 页面访问&#xff0c; 没有可用的信息 尝试22端口的ssh进行爆破 hydra -L roc…

算法的学习笔记——二进制中 1 的个数(牛客JZ15)

&#x1f600;前言 在计算机科学中&#xff0c;二进制是计算和存储数据的基础。理解二进制中的基本运算有助于我们解决各种编程问题。一个经典的问题是&#xff1a;给定一个整数&#xff0c;如何快速计算该整数的二进制表示中1的个数。 &#x1f3e0;个人主页&#xff1a;尘觉主…

【计算机毕设】基于SpringBoot的教育局综合信息管理平台-学生端

&#x1f497;博主介绍&#xff1a;✌全平台粉丝5W,高级大厂开发程序员&#x1f603;&#xff0c;博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】关注并且私信我 【联系方式】&#x1f447;&#x1f447;&#x1f447;最下边&#x1f447;&#x1f447;&…

在Windows上用Visual Studio编译OpenCV

在Windows上编译开源项目&#xff0c;有时候让人痛不欲生&#xff0c;有时候却出奇地顺利。OpenCV属于后者。本文记录这次愉快的过程。 注&#xff1a;OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了大…

全面介绍 Apache Doris 数据灾备恢复机制及使用示例

引言 Apache Doris 作为一款 OLAP 实时数据仓库&#xff0c;在越来越多的中大型企业中逐步占据着主数仓这样的重要位置&#xff0c;主数仓不同于 OLAP 查询引擎的场景定位&#xff0c;对于数据的灾备恢复机制有比较高的要求&#xff0c;本篇就让我们全面的介绍和示范如何利用这…

PyTorch 基础学习(3) - 张量的数学操作

下面是关于PyTorch中常见数学操作的概述和教程&#xff0c;包括逐点运算、比较操作、线性代数操作等&#xff0c;突出每个操作的重点用法和示例。 逐点操作 (Pointwise Operations) 1. torch.abs 功能: 计算输入张量的每个元素的绝对值。用法: torch.abs(input)示例:import …

c++继承(二)

一、友元函数的继承 友元函数不能被继承&#xff0c;就像爸爸的朋友不是你的朋友&#xff0c;如果要有友元函数&#xff0c;在子类重新定义一个。 二、静态成员的继承 静态成员的继承仍然是那个成员&#xff0c;普通成员的继承是不同的。 父类的静态成员属于当前类&#xf…

20240813 每日AI必读资讯

Flux生成网红博主因太逼真爆火&#xff01;有人用Claude写代码识破“AI美女” - Flux生成的情侣合照逼真程度达到恐怖级别&#xff0c;挑战人类视觉辨识能力。 - 网友发现Flux生成的照片几乎完美&#xff0c;但仍有细微瑕疵可供识别。 - 有人利用Flux等工具制作逼真的YouTub…

[upload]-[GXYCTF2019]BabyUpload1-笔记

尝试上传.htaccess和图片和一句话木马提示 php文件提示 响应头可以看到 构造一句话图片木马如下&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 上传成功 必须增加文件夹下jpg后缀解析php .htaccess如下 <FilesMatch "jpg">Set…

浙大数据结构慕课课后题(06-图2 Saving James Bond - Easy Version)(拯救007)

题目要求&#xff1a; This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake fi…

LabVIEW中CANopen 读取程序解读

这段程序用于创建 CANopen 接口&#xff0c;并读取 CANopen CAN 帧消息。以下是详细的解读&#xff1a; 左侧部分 node-ID (U8): 指定节点 ID&#xff0c;用于标识 CANopen 网络中的设备。CANopen interface (U32): 指定 CANopen 接口。baud rate (U32): 设置波特率&#xff0…

vulnhub系列:sp eric

vulnhub系列&#xff1a;sp eric 靶机下载 一、信息收集 nmap扫描存活&#xff0c;根据mac地址寻找IP nmap 192.168.23.0/24nmap扫描端口&#xff0c;开放端口&#xff1a;22、80 nmap 192.168.23.189 -p- -A -sV -Pndirb 扫描目录&#xff0c;.git 源码&#xff0c;admin…

向上or向下调整建堆 的时间复杂度的本质区别的讲解

知识点&#xff1a;&#xff08;N代表节点数&#xff0c;h代表高度&#xff09; 1&#xff1a;高度为h的满二叉树节点个数N为 2^&#xff08;h&#xff09;-1 即N 2^&#xff08;h&#xff09;-1 2&#xff1a;所以h log&#xff08;N1&#xff09; 一&#xff1a;向上…

C++STL详解(四)——vector类的具体实现

在上篇文章中&#xff0c;我们已经学习了vector的具体接口使用方法&#xff0c;在本篇文章中&#xff0c;我们将学习实现一个vector容器。 目录 一.vector各函数接口总览 二.vector当中的私有成员 三.默认成员函数 3.1构造函数 3.1.1构造函数1 3.1.2构造函数2 3.1.3构造…

百数移动端重大更新:全面优化,用户体验再升级!

本次发布的优化更新的功能&#xff0c;主要是为了提升用户的移动端使用体验。此次改版不仅优化了控件样式&#xff0c;提升视觉与交互体验&#xff0c;还在子表单功能上实现了重大突破&#xff0c;如新增复制、插入行功能等。 同时&#xff0c;新增功能——数据加载&#xff0…

Python之简单了解pylab绘图工具和汇编语言

《Python入门经典以解决计算问题为导向的Python编程实践》89-93页的笔记。 用pylab对数据绘图最小的通用计算 用pylab对数据绘图 PyLab是Matplotlib面向对象绘图库的过程界面。Matplotlib是整个软件包&#xff1b; matplotlib.pyplot是Matplotlib中的一个模块&#xff1b;而P…