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

Redis 缓存淘汰算法策略详解

引言

Redis 作为一款高性能的内存数据库,在处理大量数据时,由于内存有限,需要在数据达到设定的内存上限后,使用缓存淘汰策略来决定哪些数据应该被移除,以腾出空间存储新的数据。这一过程被称为缓存淘汰,通过不同的淘汰策略,Redis 能够高效管理内存并保持数据的可用性。

本文将详细介绍 Redis 的多种缓存淘汰算法及其适用场景,分析每种策略的优缺点,并提供实际应用中的建议。


第一部分:Redis 的内存管理机制

1.1 Redis 内存限制与淘汰策略

Redis 在运行时会占用系统内存,开发者可以通过 maxmemory 参数来设定 Redis 的内存使用上限。当 Redis 达到设定的内存上限时,新的写操作(如 SETINCR 等)会触发缓存淘汰机制,Redis 根据指定的淘汰策略选择部分数据进行删除,以腾出内存空间。

通过配置文件或命令行,可以设置 Redis 的内存限制和淘汰策略:

# 配置最大内存限制
maxmemory 2gb# 配置淘汰策略
maxmemory-policy <policy>

第二部分:Redis 的缓存淘汰策略

Redis 提供了 8 种内存淘汰策略,适用于不同的业务场景。淘汰策略可以通过 maxmemory-policy 配置,常见的策略包括基于 LRU(Least Recently Used)、LFU(Least Frequently Used)以及 TTL(Time to Live)等。以下是详细的介绍和适用场景。

2.1 noeviction

原理

  • 当 Redis 达到内存上限时,直接拒绝所有新的写操作,并返回错误,继续允许读取操作。不会删除任何数据。

适用场景

  • 适用于对数据一致性要求非常高,不能随意删除数据的场景。例如,某些金融或实时监控系统,需要确保所有写入的数据都能够被处理,而不允许随意淘汰。

优缺点

  • 优点:确保不会无意删除数据,系统只在内存溢出时返回错误。
  • 缺点:当内存不足时,系统将无法接受任何新的写入操作,可能会影响应用程序的正常运行。
2.2 allkeys-lru

原理

  • 在所有键中,淘汰最近最少使用的键(LRU: Least Recently Used),即优先删除最久未被访问的键,确保频繁访问的数据长时间保留在缓存中。

适用场景

  • 适合缓存系统,既缓存业务数据,也缓存非业务数据的场景。当数据访问具有明显的时间局限性时(即某些数据被频繁访问后再不被访问),可以使用 allkeys-lru 来淘汰不常用的数据。

优缺点

  • 优点:淘汰策略智能,能够优先保留高频访问的数据。
  • 缺点:在某些极端情况下,可能会误删部分重要但访问频率不高的数据。
2.3 volatile-lru

原理

  • 仅在设置了过期时间的键中,淘汰最近最少使用的键。未设置过期时间的键不会被淘汰。

适用场景

  • 适合缓存数据生命周期明确的场景,即缓存的数据具有有效期。业务数据通常不设置过期时间,因此使用 volatile-lru 只会淘汰缓存数据,而不会影响业务数据。

优缺点

  • 优点:保护了持久性数据,只对缓存数据进行淘汰。
  • 缺点:如果大部分数据没有设置过期时间,Redis 可能无法有效地释放内存。
2.4 allkeys-random

原理

  • 在所有键中随机选择某些键进行淘汰,不考虑使用频率或过期时间。

适用场景

  • 适用于数据访问频率相对均匀的场景,或者对淘汰策略要求不高的简单场景。

优缺点

  • 优点:实现简单,淘汰操作快速。
  • 缺点:随机淘汰可能导致重要数据被误删,缺乏智能化的判断。
2.5 volatile-random

原理

  • 在设置了过期时间的键中随机选择某些键进行淘汰,未设置过期时间的键不受影响。

适用场景

  • 适合那些数据设置了有效期且不需要智能淘汰机制的缓存场景。

优缺点

  • 优点:保护了永久性数据。
  • 缺点:随机淘汰可能导致重要缓存数据被误删。
2.6 volatile-ttl

原理

  • 在设置了过期时间的键中,优先淘汰存活时间最短的键,即 TTL 值最小的键。

适用场景

  • 适合那些缓存数据具有不同的过期时间,且希望优先删除即将过期数据的场景。

优缺点

  • 优点:可以合理利用即将过期的数据,提高缓存命中率。
  • 缺点:并未考虑数据的访问频率,有时可能会误删高频访问但即将过期的数据。
2.7 volatile-lfu

原理

  • 在设置了过期时间的键中,淘汰最近使用次数最少的键(LFU: Least Frequently Used)。即根据访问次数优先删除那些使用频率较低的键。

适用场景

  • 适合数据访问具有明显的使用频率差异的场景。通过淘汰不常用的数据,确保经常使用的数据能够长时间保存在内存中。

优缺点

  • 优点:能够更好地保护高频访问的数据。
  • 缺点:需要额外维护访问计数器,可能带来一定的性能开销。
2.8 allkeys-lfu

原理

  • 在所有键中,淘汰最近使用次数最少的键,无论是否设置了过期时间。适用于那些对缓存访问频率有明确要求的场景。

适用场景

  • 适合数据访问频率具有明显差异的场景,通过淘汰不常访问的数据,确保高频数据保存在内存中。

优缺点

  • 优点:能够智能化地保留高频访问数据。
  • 缺点:会带来一定的内存和性能开销。

第三部分:Redis 淘汰策略的工作原理

3.1 LRU(Least Recently Used)

LRU(最近最少使用)是一种常见的缓存淘汰算法,它的基本思想是淘汰最近最少访问的数据。Redis 实现的 LRU 算法是近似 LRU,它不会严格跟踪所有键的访问时间,而是通过采样方式实现。Redis 会随机选择一定数量的键(通过 maxmemory-samples 设置),从中选择最不常使用的键进行淘汰。

示例配置

maxmemory-policy allkeys-lru
maxmemory-samples 5

maxmemory-samples 控制 Redis 每次随机选择的键的数量,数字越大,LRU 的效果越精确,但也会增加 CPU 开销。

3.2 LFU(Least Frequently Used)

LFU(最近最少使用)基于数据的访问频率进行淘汰。Redis 使用近似计数器为每个键记录访问次数,当内存达到上限时,会优先淘汰访问次数较少的键。Redis 的 LFU 算法通过 log-log 计数器 实现,能够以较低的内存开销记录键的访问次数。

示例配置

maxmemory-policy allkeys-lfu
maxmemory-samples 10
3.3 TTL(Time to Live)

TTL 算法基于键的剩余存活时间进行淘汰。对于那些设置了过期时间的键,Redis 优先删除存活时间(TTL)最短的键。这种策略适用于数据的时效性非常强的场景,通过淘汰即将过期的数据来优化内存使用。

maxmemory-policy volatile-ttl

第四部分:实际应用中的 Redis 淘汰策略选择

根据不同的业务需求和场景,选择合适的淘汰策略对于 Redis 的性能至关重要。以下是几种典型的场景及推荐的策略:

4.1

缓存数据的重要性较高

  • 策略选择volatile-lruallkeys-lru
  • 应用场景:适用于需要缓存热点数据的场景,例如电商网站的商品信息、库存数据等。热点数据访问频繁,希望优先保留访问频繁的数据。
4.2 数据具有有效期
  • 策略选择volatile-ttl
  • 应用场景:适合那些缓存数据具有明确过期时间的场景。例如社交媒体中用户状态的缓存,过期的数据应当被优先淘汰。
4.3 数据访问频率不均
  • 策略选择allkeys-lfuvolatile-lfu
  • 应用场景:适用于访问频率具有明显差异的数据集。通过保留访问频繁的数据,可以提升缓存的命中率,例如热门文章或商品的访问记录。
4.4 内存敏感应用
  • 策略选择noeviction
  • 应用场景:适用于对数据一致性要求非常高的场景,不允许随意删除数据。应用必须严格控制内存使用,否则当内存溢出时返回错误。

第五部分:优化 Redis 淘汰策略的性能

  1. 调整 maxmemory-samples 参数:通过调整 maxmemory-samples 参数,可以控制 Redis 每次选择淘汰键时的采样数量。较大的采样数量可以提高 LRU/LFU 算法的精确度,但也会增加 CPU 的开销。

  2. 监控 Redis 内存使用:通过定期监控 Redis 的内存使用情况和命中率,可以评估当前的淘汰策略是否合适。Redis 提供了 INFO memory 命令来查看内存使用情况。

  3. 合理设置过期时间:在缓存数据时,为不同的键合理设置过期时间。对于一些时效性强的业务数据,确保数据及时过期,释放内存。

  4. 使用持久化存储:对于一些重要的数据,可以通过 RDB 或 AOF 持久化机制,确保数据在内存中被淘汰后可以从持久化存储中恢复。


结论

Redis 提供了多种缓存淘汰策略,能够根据不同的应用场景高效管理内存。通过合理选择和配置淘汰策略,开发者可以确保系统在高并发、高数据量的情况下仍然能够稳定运行。理解每种策略的优缺点和适用场景,对于提升 Redis 的性能和稳定性至关重要。在实际应用中,应根据业务需求定制化选择合适的淘汰策略,并通过持续监控和优化,确保 Redis 的高效运行。

相关文章:

Redis 缓存淘汰算法策略详解

引言 Redis 作为一款高性能的内存数据库&#xff0c;在处理大量数据时&#xff0c;由于内存有限&#xff0c;需要在数据达到设定的内存上限后&#xff0c;使用缓存淘汰策略来决定哪些数据应该被移除&#xff0c;以腾出空间存储新的数据。这一过程被称为缓存淘汰&#xff0c;通…...

Kubernetes PV生命周期的四个阶段

Kubernetes PV生命周期的四个阶段 1. Available(可用)2. Bound(已绑定)3. Released(已释放)4. Failed(失败)💖The Begin💖点点关注,收藏不迷路💖 在Kubernetes中,PersistentVolume(PV)的生命周期主要包括以下四个阶段: 1. Available(可用) 状态:PV刚创建…...

Azure OpenAI models being unable to correctly identify model

题意&#xff1a;Azure OpenAI模型无法正确识别模型。 问题背景&#xff1a; In Azure OpenAI Studio, while I am able to deploy a GPT-4 instance, the responses are based solely on GPT-3.5 Turbo. I test the same prompts in my personal ChatGPT sub and it returns …...

项目小结二()

一.个人信息的界面 这里可以进行用户信息的修改&#xff0c;并渲染数据上去 二.这两天&#xff0c;出现的问题&#xff1a; 1.mybatis中 字段取别名 &#xff08;还没验证&#xff0c;是否正确&#xff09; 问题描述&#xff1a;由于实体类中的变量名&#xff0c;与数据库中…...

《论层次架构及其在软件系统中的应用》写作框架,软考高级系统架构设计师

论文真题 层次架构作为软件系统设计的一种基本模式,对于实现系统的模块化、可维护性和可扩展性具有至关重要的作用。在软件系统的构建过程中,采用层次架构不仅可以使系统结构更加清晰,还有助于提高开发效率和质量。因此,对层次架构的理解和应用是软件工程师必备的技能之一…...

校篮球联赛系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;公告管理&#xff0c;基础数据管理&#xff0c;球队管理&#xff0c;球员管理&#xff0c;赛事信息管理&#xff0c;用户管理&#xff0c;轮播图信息 微信端账号功能包括&#…...

在 HKCR 新增项和值

HKEY_CLASSES_ROOT HKEY_CURRENT_USER\Software\Classes ∪ HKEY_LOCAL_MACHINE\Software\Classes ; 1. Win11 HKCR 根键默认是 System 所有, Win10 HKCR 根键默认是 Administrators 所有。 ; 2. 以 System、管理员 还是 普通用户 登录系统&#xff1f; ; 在注册表里&#x…...

Spring Boot 注解探秘:JSON 处理的魔法世界

在 Spring Boot 应用开发中&#xff0c;高效处理 JSON 数据同样至关重要。Spring Boot 不仅在 Bean 管理方面表现出色&#xff0c;提供强大的注解系统以助力开发者轻松管理 Bean 的生命周期和依赖注入&#xff0c;在 JSON 数据处理上也毫不逊色。本文将深入探讨 Spring Boot 中…...

利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(一)

项目简介 随着生成式人工智能的兴起&#xff0c;传统的 BI 报表功能已经无法满足用户对于自动化和智能化的需求&#xff0c;今天我们将介绍亚马逊云科技平台上的AI驱动数据可视化神器 – Quicksight&#xff0c;利用生成式AI的能力来加速业务决策&#xff0c;从而提高业务生产…...

Linux常见指令、ls、pwd、cd、touch、mkdir、rmdir、rm等的介绍

文章目录 前言一、ls二、pwd三、cd四、touch五、 mkdir六、rmdir七、rm总结 前言 Linux常见指令、ls、pwd、cd、touch、mkdir、rmdir、rm等的介绍 一、ls 列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息 -a 列出目录下的所有文件&#xff0c;…...

【Kubernetes】常见面试题汇总(八)

目录 22.简述 Kubernetes 中 Pod 的健康检查方式&#xff1f; 23.简述 Kubernetes Pod 的 LivenessProbe 探针的常见方式&#xff1f; 24.简述 Kubernetes Pod 的常见调度方式&#xff1f; 22.简述 Kubernetes 中 Pod 的健康检查方式&#xff1f; 对 Pod 的健康检查可以通过…...

CentOS 7系统双网卡配置动态链路聚合(bond4)

一、应用场景 在机房建设时&#xff0c;服务器的网卡需要配置成bond4&#xff0c;可以使用我下面的配置文件和脚本来进行配置&#xff0c;简化配置流程。 bond4&#xff0c;即动态链路聚合&#xff0c;它可以将服务器上的两个物理网卡聚合为一个&#xff0c;两个网口逻辑成一…...

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录(失败记录)

ubuntu 20.04 一直卡在登录界面&#xff0c;即使密码正确也无法登录 这次是装实体机&#xff0c;一次失败的尝试。。。 名称型号CPUIntel Xeon E5-2673 V3GPURTX 3060 mobile 安装的时候不要选install third-party software for graphics and Wi-fi hardware and additional …...

【深度学习】神经网络-怎么理解DNN、CNN、RNN?

怎么分清DNN、RNN、CNN&#xff1f; 最“大”的概念是人工神经网络&#xff08;Artificial Neural Network, ANN&#xff09;&#xff0c;它是较为广泛的术语&#xff0c;通常指的是一类模拟生物神经网络的数学模型&#xff0c;其中包括神经元、权重和连接。在这个术语下&#…...

组织应在其网络安全策略中考虑MLSecOps吗?

随着越来越多的组织拥抱人工智能 (AI) 和机器学习 (ML) 来优化操作并获得竞争优势&#xff0c;关于如何最好地保障这一强大技术的安全性的问题也日益受到关注。其中的核心是用于训练ML模型的数据&#xff0c;这对模型的行为和性能有着根本影响。因此&#xff0c;组织需要密切关…...

Windows安装HeidiSQL教程(图文)

一、软件简介 HeidiSQL是一款开源的数据库管理工具&#xff0c;主要用于管理MySQL、MariaDB、SQL Server、PostgreSQL和SQLite等数据库系统。它提供了直观的用户界面&#xff0c;使用户可以轻松地连接到数据库服务器、执行SQL查询、浏览和编辑数据、管理数据库结构等操作。 跨…...

存储课程学习笔记5_iouring的练习(io_uring,rust_echo_bench,fio)

我们知道&#xff0c;在处理大量高并发网络时&#xff0c;一般考虑并发&#xff0c;以及设计对应的方案&#xff08;比如select,poll,epoll&#xff09;等。 那么如果频繁进行文件或者磁盘的操作&#xff0c;如何考虑性能和并发&#xff0c;这里就可以考虑用到io_uring。 0&a…...

前端HTML+CSS+JS的入门学习

一.HTML HTML&#xff08;HyperText Markup Language&#xff09;即超文本标记语言&#xff0c;是用于创建网页和网页应用程序的标准标记语言。它不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;通过一系列的元素&#xff08;elements&#xff09;来告诉浏览器如何…...

通信电路和信道的区别与联系

通信电路和信道的区别 区分通信电路和信道主要在于理解它们的功能范围与作用机制。通信电路侧重于信息的处理和信号的调整&#xff0c;而信道更侧重于信号的实际传输。电路可以视为信道的接入点&#xff0c;但它们的设计和优化考量各不相同。例如&#xff0c;电路设计重视的传…...

基于深度学习的蛋白质结构预测

基于深度学习的蛋白质结构预测是利用深度学习模型来预测蛋白质的三维结构&#xff0c;这在生物学和药物研发领域具有重要意义。蛋白质的功能在很大程度上取决于其三维结构&#xff0c;准确预测蛋白质结构可以帮助科学家理解蛋白质的功能和相互作用&#xff0c;并加速药物发现的…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...