当前位置: 首页 > news >正文

Redis 内存淘汰策略详解

Redis 内存淘汰策略详解

  • 一、简介
    • Redis
    • 内存管理问题
  • 二、内存淘汰策略
    • 1.为什么需要内存淘汰策略
    • 2.内存淘汰策略分类
      • (1)noeviction
      • (2)allkeys-lru
      • (3)allkeys-lfu
      • (4)volatile-lru
      • (5)volatile-lfu
      • (6)volatile-ttl
  • 三、策略详解
    • noeviction
    • allkeys-lru
    • volatile-lru
    • allkeys-random
    • volatile-random
    • volatile-ttl
    • volatile-lfu
    • LFU 最少频繁使用算法
    • LRU 最近最少使用算法
  • 四、如何选择适合的内存淘汰策略
    • 内存淘汰策略选择时需要考虑的因素
      • 系统的容忍度
      • 缓存数据的重要性
      • 内存使用情况
      • 业务场景
    • 如何根据业务场景来选择合适的内存淘汰策略
      • noeviction 策略
      • volatile-lru 策略
      • volatile-ttl 策略
      • allkeys-lru 策略

一、简介

Redis

Redis 是一款高性能的非关系型数据库,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合和 HyperLogLog。Redis 可以用于缓存、消息队列、应用程序中的数据结构存储等场景,它的优点是响应速度快、支持丰富的数据结构和扩展性好。

内存管理问题

Redis 将所有数据都存储在内存中,因此内存管理就成为了 Redis 中需要解决的一个重要问题。当 Redis 的内存使用达到最大内存限制时,Redis 将无法再接受写请求,并根据内存淘汰策略淘汰一部分数据腾出内存。

二、内存淘汰策略

1.为什么需要内存淘汰策略

当 Redis 内存使用达到最大内存限制时,如果继续进行写入操作会导致 Redis 服务崩溃。因此,为了保证 Redis 服务的稳定性,Redis 在内存使用达到最大限制时采取一系列措施,如内存淘汰、警告等。

2.内存淘汰策略分类

Redis 内存淘汰策略主要有 6 种:

(1)noeviction

不执行任何的淘汰策略,直接返回错误信息。这种方式可能导致内存使用过多而导致 Redis 崩溃。

(2)allkeys-lru

从所有的键中选取最近最少使用的数据淘汰。这种方式通常可以保留热点数据,但是可能会出现内存碎片,导致内存浪费。

(3)allkeys-lfu

从所有的键中选取访问频率最少的数据进行淘汰。这种方式适用于处理访问分布相对均匀的数据。

(4)volatile-lru

只从设定了过期时间(ttl)的键中选取最近最少使用的数据淘汰。这种方式适用于缓存等使用场景。

(5)volatile-lfu

只从设定了过期时间(ttl)的键中选取访问频率最少的数据进行淘汰。

(6)volatile-ttl

只从设定了过期时间(ttl)的键中选取即将过期的数据进行淘汰。这种方式适用于缓存等使用场景。

三、策略详解

在 Redis 中,为了防止内存溢出,在内存不足以容纳更多数据时,Redis 会通过内存淘汰策略来淘汰一些键值对,以便给新的键值对腾出空间。下面我们将详细介绍 Redis 支持的内存淘汰策略。

noeviction

这是 Redis 的默认策略,这意味着当内存满了时,任何写操作(如 SET,HSET 等)都会返回一个错误,这种情况下,需要管理员手动清除一些键值对或者增加内存才能继续进行写操作。

allkeys-lru

该策略会针对所有的键使用 LRU(最近最少使用)算法来淘汰键值对。对于 Redis 的所有键,按照最近最少使用的原则,优先淘汰那些最近没有使用或很久没有使用的键值对。

# 配置为 allkeys-lru 策略
maxmemory-policy allkeys-lru

volatile-lru

在这种模式下,Redis 会选择过期时间较近的键来淘汰。如果一个键设置了过期时间,并且距离过期时间较远,那么 Redis 不会考虑淘汰该键值对。相反,如果一个键离过期时间只有很短的一段时间,那么 Redis 会优先淘汰该键值对。

# 配置为 volatile-lru 策略
maxmemory-policy volatile-lru

allkeys-random

在这种模式下,Redis 会随机地淘汰一些键值对,重点考虑键值对的访问频率以及键空间。

# 配置为 allkeys-random 策略
maxmemory-policy allkeys-random

volatile-random

同 allkeys-random 模式类似,但它只针对开启过期时间的键空间进行淘汰。

# 配置为 volatile-random 策略
maxmemory-policy volatile-random

volatile-ttl

在这种模式下,Redis 会选择最接近超时的键来淘汰。它与 volatile-lru 类似,不同之处在于它侧重于超时的键而非最近最少使用的键。

# 配置为 volatile-ttl 策略
maxmemory-policy volatile-ttl

volatile-lfu

该策略中采用的是 LFU(最不常用)算法。Redis 会优先淘汰使用频率最少的键值对。

# 配置为 volatile-lfu 策略
maxmemory-policy volatile-lfu

LFU 最少频繁使用算法

除了 volatile-lfu 策略的支持以外,Redis 还支持使用 LFU 算法的淘汰策略。这种策略适用于需要使用最少频繁使用算法淘汰键值对的场景。

# 配置为 LFU 策略
maxmemory-policy lfu

LRU 最近最少使用算法

除了 allkeys-lru 和 volatile-lru 策略以外,Redis 还支持使用 LRU 算法的淘汰策略。这种策略适用于需要使用最近最少使用算法淘汰键值对的场景。

# 配置为 LRU 策略
maxmemory-policy lru

四、如何选择适合的内存淘汰策略

在使用 Redis 时,为了保持系统运行的稳定性和性能,我们需要针对不同的业务场景选择适合的内存淘汰策略。下面将介绍在进行策略选择时需要考虑的因素以及如何根据业务场景来选择合适的内存淘汰策略。

内存淘汰策略选择时需要考虑的因素

系统的容忍度

系统的容忍度是指当前系统中可容忍的缓存数据被淘汰的数量。当系统的容忍度较高时,我们可以采用一些较激进的淘汰策略,例如 noeviction 策略或 volatile-lru 策略。当系统的容忍度较低时,则需要选择一些保守的淘汰策略。

缓存数据的重要性

对于不同的缓存数据,其重要性也是不同的。例如,某些缓存数据可能对应着用户的个人信息或者是支付订单等重要信息,这些数据就需要采用较为严格的淘汰策略进行保护。而对于一些只是用于辅助计算的缓存数据,则可以采用较为宽松的淘汰策略。

内存使用情况

当内存使用情况较为充足时,我们可以适当采用一些较为激进的淘汰策略来提升系统的性能。而当内存使用情况较为紧张时,则需要选择一些较为保守的淘汰策略,保证系统的稳定运行。

业务场景

不同的业务场景对于淘汰策略的要求也是不同的。例如,对于一些缓存的数据是需要长时间保存的,此时我们就需要选择一些长期使用率较高的策略进行淘汰。而对于一些需要频繁更新或者只需要用于临时计算的数据,则可以采用一些比较激进的策略。

如何根据业务场景来选择合适的内存淘汰策略

noeviction 策略

该策略是 Redis 默认的淘汰策略,其特点是不对缓存数据进行淘汰,当 Redis 内存达到限制时会导致写操作失败。该策略适用于系统中的大部分数据都是必须不可缺少、不能删除的情况。通常我们也会针对这种情况进行缓存穿透和雪崩的处理。

# 在 Redis 配置文件中添加以下配置
maxmemory-policy noeviction

volatile-lru 策略

该策略会淘汰掉最近最少使用(Least Recently Used)的带有过期时间的缓存数据。在对于缓存数据有较为明确的过期时间限制,并且对于历史数据使用的概率相对较小的情况下可以采用该策略。

# 在 Redis 配置文件中添加以下配置
maxmemory-policy volatile-lru
maxmemory 4mb

volatile-ttl 策略

该策略会淘汰掉剩余时间最短的缓存数据,通常适合缓存数据过期时间比较接近或者过期时间比较难估计的场景。

# 在 Redis 配置文件中添加以下配置
maxmemory-policy volatile-ttl
maxmemory 4mb

allkeys-lru 策略

该策略会淘汰掉最近最少使用的所有缓存数据,适合对缓存数据淘汰没有任何限制,而且服务的数据模式和访问频度难以预测,无法确定是热点访问或者是冷访问的情况。

# 在 Redis 配置文件中添加以下配置
maxmemory-policy allkeys-lru
maxmemory 4mb

相关文章:

Redis 内存淘汰策略详解

Redis 内存淘汰策略详解 一、简介Redis内存管理问题 二、内存淘汰策略1.为什么需要内存淘汰策略2.内存淘汰策略分类(1)noeviction(2)allkeys-lru(3)allkeys-lfu(4)volatile-lru&…...

初识Redis之分布式

一.简单介绍: Redis是用来在内存中, 存储数据的, 他的初心是用来搞消息中间件(或者说消息队列 很熟悉了吧~~),但是呢用的不多,他现在主要是用来做 数据库,缓存 用来存储数据, 为什么不直接存储呢? Redis的优势就在于分布式系统 二.分布式系统 要说其分布式系统,简单想想都能…...

计算机网络-笔记-第三章-数据链路层

目录 三、第三章——数据链路层 1、数据链路层概述(帧) (1)封装成帧、差错检测、可靠传输(简单介绍) (2)CSMA/CD 2、封装成帧 (1)透明传输(…...

【1】openGL glew示例代码分析绘制一个三角形

openGL文档 > docs.gl &#xff0c;可以直接查询函数的定义和使用 #include <iostream> #include <string> #include <GL/glew.h> #include <GLFW/glfw3.h>int main(void) {GLFWwindow* window;/* Initialize the library */if (!glfwInit())retu…...

android:新建工程文件介绍

一、前言当我们新建一个app时会呈现出固定的工程文件&#xff0c;这篇文章介绍新建工程里的文件。 二、介绍 Structure:就是你选择哪个页面就会显示那个页面的结构&#xff0c;就比如说我选择的是MainActivity他就会显示这个页面所使用的方法。 1-2&#xff1a;是android自动生…...

强化历程6-网络系列(2023.8.30)

文章目录 强化历程6-网络系列(2023.8.30)1 说一下OSI七层协议&#xff0c;为什么要分层&#xff1f;2 什么是TCP/IP协议&#xff0c;与OSI七层协议两者对比&#xff1f;3 什么是TCP协议&#xff0c;TCP协议和UDP协议区别&#xff1f;4 说一下TCP的三次握手和四次挥手5 两次握手…...

下载MedShapeNet

在 [1] 可下载 MedShapeNet 数据集&#xff0c;在其 Download 页&#xff0c;可选直接 GUI 下&#xff0c;或者先下一个索引文件&#xff0c;.txt 的&#xff0c;每行一条文件的下载链接&#xff0c;然后用 wget 逐条下。这里放下 wget 下载的 shell 脚本&#xff1a; 下载链索…...

根据身高重建队列【贪心算法】

根据身高重建队列 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返…...

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 高校汉服租赁网站的 设计与实现

一.项目介绍 高校汉服租赁网站分为普通用户以及管理员两类 普通用户&#xff1a; 注册、登录系统、查看汉服首页发帖公告信息、 交流论坛&#xff08;发帖、查看帖子、评论&#xff09;、 公告咨询&#xff08;查看公告以及评论&#xff09;、 汉服信息&#xff08;查…...

SQL-DQL

-----分组查询----- 1.语法&#xff1a; SELECT 字段列表 FROM 表名 [WHERE 条件 ] GROUP BY 分组字段名 [HAVING 分组后过滤条件]&#xff1b; 2.where与having区别 》执行时机不同&#xff1a;where是分组之前进行过滤&#xff0c;不满足where条件&#xff0c;不参与分组&…...

手写深拷贝方法

function deepClone(data){if(!isObject(data)){// 非对象&#xff0c;直接拷贝return data}let result {}if(data instance of Array){result []}for(let key in data){if(data.hasOwnProperty(key)){result[key] deepClone(data[key])}}return result }// 是否对象 functi…...

格子游戏——并查集

Alice和Bob玩了一个古老的游戏&#xff1a;首先画一个 nn 的点阵&#xff08;下图 n3 &#xff09;。 接着&#xff0c;他们两个轮流在相邻的点之间画上红边和蓝边&#xff1a; 直到围成一个封闭的圈&#xff08;面积不必为 1&#xff09;为止&#xff0c;“封圈”的那个人就是…...

2023最新Python重点知识万字汇总

这是一份来自于 SegmentFault 上的开发者 二十一 总结的 Python 重点。由于总结了太多的东西&#xff0c;所以篇幅有点长&#xff0c;这也是作者"缝缝补补"总结了好久的东西。 **Py2 VS Py3** * print成为了函数&#xff0c;python2是关键字* 不再有unicode对象…...

【STM32】学习笔记(TIM定时器)-江科大

TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能&#xff0c;而且…...

Parallel Context Windows for Large Language Models

本文是LLM系列文章&#xff0c;针对《Parallel Context Windows for Large Language Models》的翻译。 大语言模型并行上下文窗口 摘要1 引言2 并行上下文窗口3 上下文学习的PCW4 PCW用于QA5 相关工作6 结论和未来工作不足 摘要 当应用于处理长文本时&#xff0c;大型语言模型…...

怎么消除人声保留背景音乐?试试这几种简单方法

消除人声保留背景音乐可以用于许多不同的目的。例如&#xff0c;可以在视频制作中使用&#xff0c;以确保观众能够听到清晰的对话&#xff0c;而不会被其他噪音干扰。此外&#xff0c;它也可以用于音乐制作中&#xff0c;以便更好地混合和控制音频元素。教大家几种简单的提取方…...

积分游戏小程序模板源码

积分游戏小程序模板源码是一款可以帮助用户快速开发小程序的工具&#xff0c;此模板源码包含五个静态页面&#xff0c;分别是首页、任务列表、大转盘、猜拳等五个页面&#xff0c;非常适合进行积分游戏等相关开发。 此模板源码的前端部分非常简单易用&#xff0c;用户可以根据…...

IDEA启动两个Tomcat服务的方式 使用nginx进行反向代理 JMeter测试分布式情况下synchronized锁失效

目录 引出IDEA启动Tomcat两个端口的方式1.编辑配置2.添加新的端口-Dserver.port80833.service里面管理4.启动后进行测试 使用nginx进行反向代理反向代理多个端口运行日志查看启动关闭重启 分布式情况下synchronized失效synchronized锁代码启动tomcat两个端口nginx反向代理JMete…...

Shell 脚本入门

目录 一、Shell是什么 1.1 我们为什么要学习Shell和使用Shell&#xff1f; 1.2 Shell的分类有哪些&#xff1f; 二、Shell脚本入门知识 2.1 Shell文件命名规范 2.2 Shell解析器 2.3 用Shell 编写hello World 三、Shell的四种变量类型 3.1 系统预定义变量 3.2 自定义变…...

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——性质模态

性质&模态 角度一 角度二 矛盾关系 【对象】(1)所有、有的不;(2)所有不、有的;(3)某个、某个不。 【典例】①所有偶像都是靠颜值的。 ②有的偶像不是靠颜值的。 试分析: (1)如果①为真,试判断②的真假。 (2)如果①为假,试判断②的真假。 (3)①和②是否可…...

无涯教程-Android - ToggleButton函数

ToggleButton将已选中/未选中状态显示为按钮。它基本上是一个带有指示灯的开/关按钮。 Toggle Button ToggleButton属性 以下是与ToggleButton控件相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关方法。 Sr.No.Attribute…...

unity VS无法进行断点调试

有时候我们的VS无法进行断点调试&#xff0c;报错如下&#xff1a; 原因是&#xff1a;开启了多个项目&#xff0c;vs无法找到调式项目 解决&#xff1a;点击菜单栏--调试----附加unity调试程序 会弹出一个框&#xff0c;然后选择你要调试的项目 即可...

Pandas由入门到精通-组合与合并数据

采集的数据存储后通常会分为多个文件或数据库,如何将这些文件按需拼接,或按键进行连接十分重要。这节将介绍数据索引的复杂操作如分层索引,stack,unstack,seet_index,reset_index等帮助重构数据,数据的拼接如merge,join,concat,combine_first等帮助连接数据,以及数据透视表…...

Unexpected mutation of “xxxx“ prop

原因 是因为子级修改了父级的数据&#xff0c;所以eslint执行的时候报了这个错 修复方式 1 如果是弹窗等组件&#xff0c;可以根据功能进行修改&#xff0c;比如我这块用的 element ui 的 dialog&#xff0c;便可以改成这样 使用 model-value 代替 修复方式 2 新建子组件…...

七、基础篇总结

...

前端面试基础面试题——2

1.什么是json? json可以存在哪几种数据类型?在什么时候用&#xff1f; 2.什么是作用域&#xff1f; 3.http和https分别是什么&#xff1f;区别是什么&#xff1f; 4.介绍一下js的节流与防抖? 5.什么是cookie&#xff1f;cookie的优缺点。 6.js的三种排序方法&#xff0…...

docker 搭建rknn转换环境

文章目录 下载rknn搭建docker 环境进入镜像并挂载运行代码 下载rknn https://github.com/rockchip-linux/rknn-toolkit2 搭建docker 环境 进入到docker 的文件目录下 docker build -t run:v3 . -f Dockerfile_ubuntu_18_04_for_cp36 进入镜像并挂载 docker run -it -v /ho…...

机器学习:争取被遗忘的权利

随着越来越多的人意识到他们通过他们经常访问的无数应用程序和网站共享了多少个人信息&#xff0c;数据保护和隐私一直在不断讨论。看到您与朋友谈论的产品或您在 Google 上搜索的音乐会迅速作为广告出现在您的社交媒体提要中&#xff0c;这不再那么令人惊讶。这让很多人感到担…...

MATLAB实现AHP层次分析法——以情人节选取礼物为例

问题背景&#xff1a; 情人节来临之际&#xff0c;广大直男&#xff08;女&#xff09;同胞在给异性朋友选购礼物时会遇到难题——什么才是礼物好坏最重要的标准&#xff1f;基于层次分析法AHP进行计算&#xff0c;得出最高权重的指标&#xff0c;给出各位朋友选购礼物的一种思…...

flutter使用Chanel与原生通信

在Flutter中&#xff0c;Platform Channel允许Flutter与原生平台&#xff08;如Android和iOS&#xff09;之间进行双向通信&#xff0c;以便在Flutter应用程序和原生代码之间传递消息和调用功能。 以下是使用Platform Channel与原生通信的一般步骤&#xff1a; 1. 在Flutter端…...