当前位置: 首页 > 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;并加速药物发现的…...

编译原理实战:5分钟搞定词法分析器的选择题(含答案解析)

编译原理实战&#xff1a;词法分析器选择题高效解题指南 在编译原理的学习和考试中&#xff0c;词法分析器相关选择题往往是考察重点&#xff0c;也是许多同学容易失分的部分。面对复杂的正规式、有限自动机等概念&#xff0c;如何快速准确地做出判断&#xff1f;本文将带你深入…...

React-PDF自定义字体粗细终极指南:实现精确文本字重控制的完整教程

React-PDF自定义字体粗细终极指南&#xff1a;实现精确文本字重控制的完整教程 【免费下载链接】react-pdf &#x1f4c4; Create PDF files using React 项目地址: https://gitcode.com/gh_mirrors/re/react-pdf React-PDF是一个功能强大的库&#xff0c;允许开发者使用…...

Pixel Dream Workshop 作品集:基于LSTM时序模型生成的动态艺术画展示

Pixel Dream Workshop 作品集&#xff1a;基于LSTM时序模型生成的动态艺术画展示 1. 当AI遇见艺术&#xff1a;LSTM如何创造动态视觉叙事 在数字艺术创作领域&#xff0c;时序模型正带来一场革命性的变化。Pixel Dream Workshop最新推出的动态艺术画系列&#xff0c;展示了长…...

别再手动校正了!用Landsat 9 L2SP地表反射率数据,在QGIS里5分钟搞定NDVI和水体提取

遥感分析效率革命&#xff1a;用Landsat 9 L2SP数据在QGIS中实现5分钟精准制图 当遥感数据处理流程从传统数小时缩短至五分钟&#xff0c;这意味着什么&#xff1f;去年在亚马逊雨林监测项目中&#xff0c;我们团队曾因大气校正步骤延误错过了最佳干预时机。如今Landsat 9 L2SP…...

Jieba分词实战:5分钟搞定中文文本词频统计(附完整代码)

Jieba分词实战&#xff1a;5分钟搞定中文文本词频统计&#xff08;附完整代码&#xff09; 中文文本处理是自然语言处理&#xff08;NLP&#xff09;的基础环节&#xff0c;而分词则是中文文本处理的第一步。不同于英文等空格分隔的语言&#xff0c;中文文本需要专门的工具进行…...

WavePWM库:嵌入式LED正弦调光算法与实现

1. WavePWM库概述&#xff1a;正弦波形LED调光的底层实现原理与工程应用 WavePWM是一个面向嵌入式LED驱动场景的轻量级波形PWM计算库&#xff0c;其核心价值不在于直接控制硬件引脚&#xff0c;而在于 以确定性数学模型生成高保真度的正弦&#xff08;或类正弦/指数&#xff0…...

华为MateBook D14安装Ubuntu16避坑指南:WiFi/蓝牙/触控板驱动一键搞定

华为MateBook D14安装Ubuntu 16.04驱动优化全攻略 华为MateBook D14作为一款高性价比轻薄本&#xff0c;在安装Ubuntu 16.04时可能会遇到WiFi、蓝牙和触控板驱动不兼容的问题。这主要源于硬件迭代速度远超Linux内核更新周期——你的笔记本搭载了新一代无线网卡和输入设备&#…...

SPIRAN ART SUMMONER优化指南:如何调整参数让生成的图片更符合预期

SPIRAN ART SUMMONER优化指南&#xff1a;如何调整参数让生成的图片更符合预期 1. 理解SPIRAN ART SUMMONER的核心参数 SPIRAN ART SUMMONER作为一款基于Flux.1-Dev模型的图像生成工具&#xff0c;其参数设置直接影响最终输出效果。与普通AI绘画工具不同&#xff0c;它融入了…...

【硬核】让所有AI Agent自动进化!港大开源OpenSpace,一个命令让你的Claude Code/Cursor/OpenClaw秒变超级智能体

最近刷 GitHub&#xff0c;发现了一个让我眼前一亮的项目——OpenSpace。 它解决了一个超级痛点&#xff1a;现在的 AI Agent&#xff08;比如 Claude Code、OpenClaw、Cursor&#xff09;都很强大&#xff0c;但它们从不学习、永不进化——每次任务都是从头开始&#xff0c;浪…...

深度学习中的优化器:原理与实践

深度学习中的优化器&#xff1a;原理与实践 一、背景与动机 在深度学习中&#xff0c;优化器是模型训练的核心组件&#xff0c;它决定了模型参数如何根据损失函数的梯度进行更新。选择合适的优化器对于模型的训练速度和最终性能至关重要。本文将深入探讨各种优化器的核心原理、…...