Redis 缓存淘汰算法策略详解
引言
Redis 作为一款高性能的内存数据库,在处理大量数据时,由于内存有限,需要在数据达到设定的内存上限后,使用缓存淘汰策略来决定哪些数据应该被移除,以腾出空间存储新的数据。这一过程被称为缓存淘汰,通过不同的淘汰策略,Redis 能够高效管理内存并保持数据的可用性。
本文将详细介绍 Redis 的多种缓存淘汰算法及其适用场景,分析每种策略的优缺点,并提供实际应用中的建议。
第一部分:Redis 的内存管理机制
1.1 Redis 内存限制与淘汰策略
Redis 在运行时会占用系统内存,开发者可以通过 maxmemory
参数来设定 Redis 的内存使用上限。当 Redis 达到设定的内存上限时,新的写操作(如 SET
、INCR
等)会触发缓存淘汰机制,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-lru
或allkeys-lru
- 应用场景:适用于需要缓存热点数据的场景,例如电商网站的商品信息、库存数据等。热点数据访问频繁,希望优先保留访问频繁的数据。
4.2 数据具有有效期
- 策略选择:
volatile-ttl
- 应用场景:适合那些缓存数据具有明确过期时间的场景。例如社交媒体中用户状态的缓存,过期的数据应当被优先淘汰。
4.3 数据访问频率不均
- 策略选择:
allkeys-lfu
或volatile-lfu
- 应用场景:适用于访问频率具有明显差异的数据集。通过保留访问频繁的数据,可以提升缓存的命中率,例如热门文章或商品的访问记录。
4.4 内存敏感应用
- 策略选择:
noeviction
- 应用场景:适用于对数据一致性要求非常高的场景,不允许随意删除数据。应用必须严格控制内存使用,否则当内存溢出时返回错误。
第五部分:优化 Redis 淘汰策略的性能
-
调整
maxmemory-samples
参数:通过调整maxmemory-samples
参数,可以控制 Redis 每次选择淘汰键时的采样数量。较大的采样数量可以提高 LRU/LFU 算法的精确度,但也会增加 CPU 的开销。 -
监控 Redis 内存使用:通过定期监控 Redis 的内存使用情况和命中率,可以评估当前的淘汰策略是否合适。Redis 提供了
INFO memory
命令来查看内存使用情况。 -
合理设置过期时间:在缓存数据时,为不同的键合理设置过期时间。对于一些时效性强的业务数据,确保数据及时过期,释放内存。
-
使用持久化存储:对于一些重要的数据,可以通过 RDB 或 AOF 持久化机制,确保数据在内存中被淘汰后可以从持久化存储中恢复。
结论
Redis 提供了多种缓存淘汰策略,能够根据不同的应用场景高效管理内存。通过合理选择和配置淘汰策略,开发者可以确保系统在高并发、高数据量的情况下仍然能够稳定运行。理解每种策略的优缺点和适用场景,对于提升 Redis 的性能和稳定性至关重要。在实际应用中,应根据业务需求定制化选择合适的淘汰策略,并通过持续监控和优化,确保 Redis 的高效运行。
相关文章:

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

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
题意:Azure OpenAI模型无法正确识别模型。 问题背景: 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 …...

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

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

校篮球联赛系统小程序的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,公告管理,基础数据管理,球队管理,球员管理,赛事信息管理,用户管理,轮播图信息 微信端账号功能包括&#…...

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

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

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

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

【Kubernetes】常见面试题汇总(八)
目录 22.简述 Kubernetes 中 Pod 的健康检查方式? 23.简述 Kubernetes Pod 的 LivenessProbe 探针的常见方式? 24.简述 Kubernetes Pod 的常见调度方式? 22.简述 Kubernetes 中 Pod 的健康检查方式? 对 Pod 的健康检查可以通过…...

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

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录(失败记录)
ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录 这次是装实体机,一次失败的尝试。。。 名称型号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? 最“大”的概念是人工神经网络(Artificial Neural Network, ANN),它是较为广泛的术语,通常指的是一类模拟生物神经网络的数学模型,其中包括神经元、权重和连接。在这个术语下&#…...

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

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

存储课程学习笔记5_iouring的练习(io_uring,rust_echo_bench,fio)
我们知道,在处理大量高并发网络时,一般考虑并发,以及设计对应的方案(比如select,poll,epoll)等。 那么如果频繁进行文件或者磁盘的操作,如何考虑性能和并发,这里就可以考虑用到io_uring。 0&a…...

前端HTML+CSS+JS的入门学习
一.HTML HTML(HyperText Markup Language)即超文本标记语言,是用于创建网页和网页应用程序的标准标记语言。它不是一种编程语言,而是一种标记语言,通过一系列的元素(elements)来告诉浏览器如何…...

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

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

基于 Redis 的分布式锁实现原理及步骤
实现分布式锁的目的是在分布式系统中,保证多个节点之间对共享资源的并发访问是互斥的。常用的分布式锁实现方式有以下几种:基于数据库、基于 Redis、基于 Zookeeper。下面详细介绍基于 Redis 的分布式锁实现原理及步骤。 一、Redis 分布式锁原理 唯一性…...

21_动态规划与数据结构结合
菜鸟:老鸟,我最近在处理一个数据操作时遇到了性能问题。我需要计算一个数组中某些子数组的和,但直接计算太慢了,有没有什么更高效的方法? 老鸟:你提到的这个问题其实可以通过动态规划结合数据结构来解决。…...

React与Vue的对比
异同总结 相同点: 都有组件化思想 都支持服务器端渲染 都有Virtual DOM(虚拟dom) 数据驱动视图 都有支持native的方案:Vue的weex、React的React native 都有自己的构建工具:Vue的vue-cli、React的Create React A…...

精密量测软件(仿KLA免费浏览器程序ProfilmOnline)
KLA在线软件分析图 软件仿KLA公司免费浏览器软件ProfilmOnline,软件地址ProfilmOnline - 用于3D轮廓仪和AFM的表面成像、分析和测量软件 可以直接从profilmonline上下载3D图加载对比分析,当前已完成的内容有 1、调平 2、尖峰去噪 3、能量密度图&…...

Java项目: 基于SpringBoot+mybatis+maven实现的IT技术交流和分享平台(含源码+数据库+毕业论文)
一、项目简介 本项目是一套基于SpringBootmybatismaven实现的IT技术交流和分享平台 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美…...

STL02——手写简单版本的list
手写一个简单版本的list 设计一个名为 List 的 List 类,该类具有以下功能和特性: 1、基础成员函数 构造函数:初始化 List 实例析构函数:清理资源,确保无内存泄露 2、核心功能 在 List 末尾添加元素在 List 开头添…...

基于SpringBoot的校园自助洗衣服务管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的校园自助洗衣服务…...

音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件
在文章《音视频入门基础:PCM专题(1)——使用FFmpeg命令生成PCM音频文件并播放》中讲述了生成PCM文件的方法。通过FFmpeg命令可以把该PCM文件转为AAC裸流文件: ./ffmpeg -f s16le -ar 44100 -ac 2 -i audio1.pcm audio1.aac 由于…...

第 6 篇 自定义 Helm Chart
文章目录 第 1 步:创建 chartChart.yamlvalues.yamltemplates 模板文件_helpers.tpl 模板辅助文件serviceaccount.yamlservice.yamldeployment.yamlhpa.yamlingress.yamlNOTES.txttests/test-connection.yaml 第 2 步:检查 chart 格式第 3 步:…...

Jenkis部署vue前端项目提示:sh: vue-cli-service: command not found
解决方法: 1. 进入到/var/lib/jenkins/workspace/项目名下,查看是否有node_modules,如果没有执行 npm install 2. 如果执行npm intall的过程中提示:npm ERR! 407 Proxy Authentication Required - GET http://registry.npm.taob…...