谈谈Redis的数据淘汰策略

目录

写在前面

数据淘汰策略

不进行数据淘汰策略

进行数据淘汰策略

LRU和LFU的对比


写在前面

我们都知道redis中的数据是采访在内存中的,在从redis中增删查改数据时,都是操作的内存中的数据,而内存是有限的,当内存被占满了之后,这时就有必要将一些数据清理淘汰掉,以便新的数据能够放到redis中。而到底需要去淘汰掉那些数据是我们需要去考虑的问题,也是我今天想谈的东西。

Redis的内存大小可以通过配置文件redis.conf中的maxmemory参数来进行配置。maxmemory参数的默认值为0,表示Redis可以使用的最大内存为无限大。

如果要限制Redis使用的最大内存大小,可以将maxmemory参数设置为一个正整数,表示Redis最大可以使用的内存大小(单位是字节)。例如,可以将maxmemory参数设置为"maxmemory 512mb",表示Redis最大可以使用512MB的内存。

通过设置maxmemory-policy参数来定义当内存不足时的处理策略。maxmemory-policy参数的默认值为"noeviction",表示当内存不足时,Redis会拒绝写入新数据。

其他可选的策略包括volatile-lru、allkeys-lru、volatile-random、allkeys-random、volatile-ttl和volatile-lfu等。需要注意的是,Redis的内存大小配置需要结合实际情况进行调整,避免内存不足或浪费。 

 注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕, 如不能达到内存清理的要求,将出现错误信息如下:

(error) OOM command not allowed when used memory >'maxmemory'

数据淘汰策略

不进行数据淘汰策略

noeviction: 它是Redis3.0 之后,默认的内存淘汰策略,它表示当运行内存超过最大设置内存时,不淘汰任何数据,这时如果有新的数据写入,则会触发 OOM,但是如果没用数据写入的话,只是单纯的查询或者删除操作的话,还是可以正常工作。


进行数据淘汰策略

大体上可以分为4种,lrulfurandomttl。 

在设置了过期时间的数据中进行淘汰

  • volatile-random: 随机淘汰设置了过期时间的任意键值;
  • volatile-ttl: 优先淘汰更早过期的键值;
  • volatile-lru: 它是Redis3.0 之前,默认的内存淘汰策略,淘汰所有设置了过期时间的键值中,最久未使用的键值;
  • volatile-lfu: Redis 4.0 后新增的内存淘汰策略,淘汰所有设置了过期时间的键值中,最少使用的键值;

在所有数据范围内进行淘汰

  • allkeys-random: 随机淘汰任意键值;
  • allkeys-lru: 淘汰整个键值中最久未使用的键值;
  • allkeys-lfu Redis 4.0 后新增的内存淘汰策略,淘汰整个键值中最少使用的键值;

数据库有1000万数据 ,Redis只能缓存20w数据, 保证Redis中的数据都是热点数据 可以采用 使用 allkeys-lru (挑选最近最少使用的数据淘汰)淘汰策略,那留下来的都是经常访问的热点数据  。

如果Redis的内存用完了,要看redis的数据淘汰策略是什么,如果是默认的配置,redis内存用完以后则直接报错。

在实际使用中,可以根据具体的业务需求和数据特性选择合适的淘汰策略。例如,对于一些重要的数据,可以采用 noeviction 策略,以保证数据的完整性;对于一些缓存数据,可以采用 volatile-lru 策略,以保证缓存的有效性。

LRU和LFU的对比

LRU(最近最少使用):LRU策略根据数据项在过去的访问时间来确定淘汰哪些数据。最近最少使用的数据项将被优先淘汰。LRU的核心思想是,如果一个数据项最近被访问过,那么它在未来可能还会被访问到。

LFU(最不频繁使用):LFU策略根据数据项被访问的频率来确定淘汰哪些数据。访问次数最少的数据项将被优先淘汰。LFU的核心思想是,访问频次较高的数据项可能在未来还会被多次访问,因此应该保留在缓存中。

  • LRU侧重于数据项最近的访问时间,而LFU侧重于数据项的访问频率。
  • LRU易于实现,通常使用双向链表和哈希表。而LFU实现起来相对复杂,需要使用最小堆或哈希表等数据结构。
  • 在某些情况下,LFU可能比LRU表现得更好,因为它更关注访问频率。然而,LFU对于某些访问模式可能会导致较低的命中率。

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

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

相关文章

嗨,你开始养生了吗?

一、年少轻狂 曾几何时我们意气风发,矫健如飞,吃大碗的面,熬最晚的夜,好像十二点之前睡觉都是浪费生命,刚工作时加班对我们来说那就是小儿科,一点都不觉得累,加完班回来还要看一会手机才能睡着…

[SWPUCTF 2021 新生赛]PseudoProtocols

题目很明确了就是伪协议 php://filter/convert.base64-encode/resourcehint.php 提交的伪协议的内容需要是 I want flag,就会echo flag 方法1:adata://text/plain,I want flag 方法2:adata://text/plain;base64,SSB3YW50IGZsYWc

KAO2 入门到熟练 看这一篇文章就够了

KOA 介绍 官网地址: https://koa.bootcss.com/ Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调…

万字解析设计模式之策略模式、命令模式

一、策略模式 1.1概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 策略模式(Strategy Pattern)是一个行为型设计模式,它定义了一组算法家族,分…

看Spring源码不得不会的@Enable模块驱动实现原理讲解

这篇文章我想和你聊一聊 spring的Enable模块驱动的实现原理。 在我们平时使用spring的过程中,如果想要加个定时任务的功能,那么就需要加注解EnableScheduling,如果想使用异步的功能,那就要加EnableScheduling注解,其实…

「盘点」界面控件DevExtreme UI v23.1中的API增强

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

【赠书第10期】从概念到现实:ChatGPT和Midjourney的设计之旅

文章目录 前言 1 ChatGPT的崛起 2 Midjourney的探索 3 技术创新的交汇 4 对未来的影响 5 结论 6 推荐图书 7 粉丝福利 前言 在过去的几年里,自然语言处理和聊天模型的领域取得了飞速的发展。ChatGPT 作为一个由OpenAI 开发的大型语言模型,以其强…

java后端redis缓存缓存预热

java后端&redis缓存&缓存预热 缓存概述 缓存:从数据库(磁盘)中取数据到前端展示,速度很慢。为了提高速度可以使用缓存,即把数据预先查出来,放到一个更快读取的介质,比如内存&#xff…

SELinux refpolicy详解(5)

接前一篇文章:SELinux refpolicy详解(4) 三、refpolicy内容详解 1. README 文件路径:refpolicy源码根目录/README。 文件内容如下: 1) Reference Policy make targets:General Make targets:install-src Install the policy sources into/etc/selinux/NAME/src/polic…

【opencv】计算机视觉基础知识

目录 前言 1、什么是计算机视觉 2、图片处理基础操作 2.1 图片处理:读入图像 2.2 图片处理:显示图像 2.3 图片处理:图像保存 3、图像处理入门基础 3.1 图像成像原理介绍 3.2 图像分类 3.2.1 二值图像 3.2.2灰度图像 3.2.3彩色图像…

算法与数据结构有区别吗?

算法和数据结构并不是同一件事。严格来说,它们并不是等效的。但是,我们通常在使用的时候会互换这两个术语。为了简便,后文我们会用数据结构这个术语来指代“数据结构及其所有相关的方法”。 有很多方法可以用来说明这两个术语之间的区别&…

企业软件手机app定制开发趋势|小程序网站搭建

企业软件手机app定制开发趋势|小程序网站搭建 随着移动互联网的快速发展和企业数字化转型的加速,企业软件手机App定制开发正成为一个新的趋势。这种趋势主要是由于企业对于手机App的需求增长以及现有的通用应用不能满足企业特定需求的情况下而产生的。 1.企业软件手…

​iOS Class Guard github用法、工作原理和安装详解及使用经验总结

iOS Class Guard是一个用于OC类、协议、属性和方法名混淆的命令行工具。它是class-dump的扩展。这个工具会生成一个symbol table,这个table在编译期间会包含进工程中。iOS-Class-Guard能有效的隐藏绝大多数的类、协议、方法、属性和 实例变量 名。 iOS-Class-Guard不…

在 S/4HANA、ECC 和 ERP 上轻松扩展或简化 SAP WM,并将其自动化到移动环境中

为您的 SAP WM 提供完整的本地 SAP 图形用户界面 基于原生通道架构(NCA),iOS、Android 和手持 Scanguns 版 Liquid UI 可与 SAP WM 原生连接,同时保留 SAP GUI 丰富的事务处理功能。它使您无需编程即可直接从移动设备访问 MIGO、…

安全意识成熟度模型

安全意识成熟度模型是指导企业组织有效识别、管理和衡量团队和员工的安全意识风险,评估和衡量团队和员工的安全意识的评估模型。这套模型是多年以来通过对200多个具有安全意识的职员进行调研后建立的,安全意识成熟度模型使组织能够确定当前安全意识的成熟…

深度学习——激活函数汇总

深度学习——激活函数汇总 一、ReLU 一、ReLU 参考资料: https://zhuanlan.zhihu.com/p/428448728

C++核心编程——运算符重载

C核心编程——运算符重载 运算符重载的方法运算符重载函数作成员函数与友元函数重载双目运算符重载单目运算符重载流插入运算符和"<<"和流提取运算符">>"重载流插入运算符和"<<"流提取运算符">>" 运算符重载的…

LabVIEW开发自适应降噪ANC

LabVIEW开发自适应降噪ANC 在许多情况下&#xff0c;信号很嘈杂&#xff0c;必须消除噪声。自适应降噪&#xff08;ANC&#xff09;是可用于消除信号噪声的主要实时方法之一。可以使用LabVIEW自适应滤滤器工具包来设计ANC应用程序。本文介绍使用自适应筛选器工具包的ANC的一些…

【深度学习】概率图模型(二)有向图模型详解(条件独立性、局部马尔可夫性及其证明)

文章目录 一、有向图模型1. 贝叶斯网络的定义2. 条件独立性及其证明a. 间接因果关系 X 3 → X 2 → X 1 X_3 \rightarrow X_2 \rightarrow X_1 X3​→X2​→X1​b. 间接果因关系 X 1 → X 2 → X 3 X_1 \rightarrow X_2 \rightarrow X_3 X1​→X2​→X3​c. 共因关系 X 1 ← X…

java中如何将mysql里面的数据取出来然后通过stream流的方式进行数据处理代码实例?

在 Java 中使用 Stream 流的方式从 MySQL 数据库中取出数据并进行处理&#xff0c;你可以通过 JDBC&#xff08;Java Database Connectivity&#xff09;来实现。下面是一个简单的代码示例&#xff1a; import java.sql.*; import java.util.stream.Stream; public class MySQ…