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

Redis过期删除和缓存淘汰

1. 过期删除

在 Redis 中,键的过期删除机制主要包括惰性删除(Lazy Deletion)和定期删除(Periodic Deletion)。这两种策略有各自的优缺点,Redis 最终会结合这两种方法来管理过期键。

1.1 惰性删除(Lazy Deletion)

机制: 惰性删除策略是指当客户端访问某个键时,Redis会检查该键是否已经过期。如果键已经过期,Redis会立即删除这个键,并返回nil(如果是GET操作)或相应的错误信息。
优点:
1.性能友好: 惰性删除仅在访问键时才会检查是否过期,因此不会额外增加Redis的负担,这种方法对Redis的整体性能影响最小。
2. 实时性: 保证了每次读取时都能返回最新的、未过期的数据,不会读取到已过期的数据。
缺点:
可能的内存浪费: 如果某些键在设置了过期时间后没有被访问过,它们将一直占据内存,直到Redis因内存不足而进行主动清理,这可能导致内存中存在大量无用的过期键,占用宝贵的内存资源。

1.2 定期删除(Periodic Deletion)

机制:
定期删除策略是指 Redis 每隔一段时间会随机抽取一部分设置了过期时间的键,并删除其中已经过期的键。Redis 默认会每 100 毫秒执行一次这样的删除操作,具体实现如下:
Redis 会随机抽取几个数据库(每次处理最多 20 个数据库)。
对于每个选中的数据库,随机选择一定数量的键(通常是 20 个键)。
检查这些键是否已经过期,并删除过期的键。
如果发现过期键的比例超过 25%,Redis 会重复执行上述步骤,以避免内存中存在过多过期键。

优点:
减少内存浪费: 通过定期删除,可以在不访问键的情况下也能清理掉部分过期键,减少内存的占用。
自动清理: 即使某些键没有被访问,定期删除也能确保它们在过期后的一段时间内被清理。

缺点:
非实时性: 定期删除不是实时的,因此有些过期键可能会在过期后的一段时间内仍然存在于内存中,直到下一次定期删除操作才被清理。
性能消耗: 虽然定期删除的频率和强度是可控的,但它仍然会消耗一定的 CPU 资源,特别是在处理大批量键时,可能会影响 Redis 的响应性能。

Redis 实际上结合了惰性删除和定期删除两种策略,以达到在性能和内存使用之间的平衡:

惰性删除 主要用于保证数据的实时性。每次客户端访问键时,Redis 都会检查该键是否过期,如果过期就会立即删除。这种方法确保了客户端永远不会读到过期的数据。

定期删除 主要用于清理那些未被访问的过期键。通过周期性扫描和删除过期键,Redis 避免了这些键占用过多的内存。

2.缓存淘汰

Redis 缓存淘汰策略是在 Redis 达到内存上限时,为了释放内存而删除某些键值对的机制。合理配置缓存淘汰策略对于保证系统的性能和稳定性至关重要。

2.1 背景

Redis 是一个内存数据库,所有数据都存储在内存中。当 Redis 的数据量持续增加并达到内存上限时,无法再添加新的数据。此时,Redis 提供了多种缓存淘汰策略来决定删除哪些数据以腾出空间。

2.2 Redis支持的缓存淘汰策略

Redis 提供了多种缓存淘汰策略,可以通过 maxmemory-policy 配置项进行设置。常见的策略包括:
1.noeviction
描述: 默认策略,不淘汰任何数据。当内存达到上限时,所有可能导致内存增加的写操作都会失败,并返回错误。
适用场景: 适用于希望严格控制内存使用,防止数据丢失的场景。主要用于不适合作为缓存,而是需要持久保存所有数据的场景。
2.allkeys-lru
描述: 在所有键中,使用 LRU(Least Recently Used,最近最少使用)算法淘汰最不常使用的键。
适用场景: 适用于典型的缓存场景,优先保留最近访问的数据,淘汰长时间未访问的冷数据。
3. volatile-lru
描述: 在设置了过期时间的键中,使用 LRU 算法淘汰最不常使用的键。
适用场景: 适用于部分数据需要持久存储,但也希望利用 LRU 算法对设置了过期时间的缓存数据进行淘汰的场景。
4.allkeys-random
描述: 在所有键中随机选择键进行淘汰。
适用场景: 适用于数据访问模式难以预测,所有数据重要性相似的场景。
5.volatile-random
描述: 在设置了过期时间的键中随机选择键进行淘汰。
适用场景: 适用于既要保留部分永久性数据,又希望对可过期数据进行随机淘汰的场景。
6.volatile-ttl
描述: 在设置了过期时间的键中,优先淘汰 TTL(Time to Live,剩余生存时间)值最小的键。
适用场景: 适用于需要根据键的生存时间优先级进行淘汰的场景,如希望尽量保留新近缓存的短期数据。

2.3 LRU 算法的细节

LRU 算法通过追踪每个键的使用情况来判断哪些键是最近最少使用的。Redis 在 LRU 策略下不会对所有键进行严格的 LRU 排序,而是通过近似算法实现。默认情况下,Redis 会采样 5 个键来选择淘汰对象。可以通过 maxmemory-samples 配置项调整采样数量,采样数量越大,LRU 策略越接近最优,但计算开销也会增加。

2.4 最大内存设置

缓存淘汰策略与 Redis 的 maxmemory 设置紧密相关。通过设置 maxmemory,可以限定 Redis 的最大内存使用量,当内存使用达到这个上限时,Redis 就会根据配置的淘汰策略开始删除键值对。
配置示例:

maxmemory 256mb
maxmemory-policy allkeys-lru

2.5 实际应用中的考虑

数据重要性: 如果部分数据非常重要且不应被淘汰,可以选择 volatile-lru 或 volatile-random,以确保无过期时间的键不被淘汰。
访问模式: 如果某些数据访问频率极高,且希望这些数据始终保留在内存中,可以选择 allkeys-lru。
系统性能: 在高并发场景下,合理设置 maxmemory-samples 可以优化 LRU 算法的性能。

2.6 注意事项

防止缓存雪崩: 在高并发情况下,避免所有缓存同时过期导致的缓存雪崩,可以通过设置不同的过期时间来平滑过期。
监控与调整: 定期监控 Redis 的内存使用和命中率,根据业务需求调整 maxmemory 和淘汰策略,确保缓存系统的高效运行。

相关文章:

Redis过期删除和缓存淘汰

1. 过期删除 在 Redis 中,键的过期删除机制主要包括惰性删除(Lazy Deletion)和定期删除(Periodic Deletion)。这两种策略有各自的优缺点,Redis 最终会结合这两种方法来管理过期键。 1.1 惰性删除&#xf…...

Golang | Leetcode Golang题解之第401题二进制手表

题目&#xff1a; 题解&#xff1a; func readBinaryWatch(turnedOn int) (ans []string) {for i : 0; i < 1024; i {h, m : i>>6, i&63 // 用位运算取出高 4 位和低 6 位if h < 12 && m < 60 && bits.OnesCount(uint(i)) turnedOn {ans …...

TON智能合约stdlib_ext库:扩展功能一览

TON&#xff08;TheOpenNetwork&#xff09;作为一个去中心化的区块链平台&#xff0c;其智能合约功能强大而灵活。在TON智能合约的开发过程中&#xff0c;stdlib.fc库提供了基础的功能支持。然而&#xff0c;对于一些高级或特定的需求&#xff0c;stdlib.fc可能无法满足。为此…...

LabVIEW开发FPGA方法与FIFO数据丢失处理

开发基于NI 7975R FPGA的系统涉及一系列流程&#xff0c;包括驱动安装、LabVIEW项目设置、开发调试、编译和与Windows系统的通信。重点在于FIFO的正确配置&#xff0c;避免数据丢失是关键环节之一&#xff0c;尤其是在使用高速数据流传输时。以下将详细介绍这些过程&#xff0c…...

Python中的内存池机制

在Python中&#xff0c;内存管理是一个复杂但至关重要的主题&#xff0c;它直接关系到程序的性能和稳定性。Python的内存管理机制包括对象的分配、追踪以及回收&#xff0c;其中内存池&#xff08;Memory Pool&#xff09;是这一机制中的一个重要组成部分。内存池机制通过预先分…...

智能家居系统(基于STM32F103C8T6标准库+FreeRTOS+Qt串口开发实现)

视频演示&#xff1a;基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目_哔哩哔哩_bilibili 基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目: https://pan.baidu.com/s/1f41gAfOOnlcQoKoMx3o84A?pwd6j2g 提取码: 6j2g 注&#xff1a;本项目为学习完…...

[数据集][目标检测]脊椎检测数据集VOC+YOLO格式1137张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1137 标注数量(xml文件个数)&#xff1a;1137 标注数量(txt文件个数)&#xff1a;1137 标注…...

大受欢迎的游戏却又意外被作者下架的《Flappy Bird》将重返iPhone

据"Flappy Bird 基金会"官网称&#xff0c;标志性的侧卷轴滚动游戏《Flappy Bird》将很快回归 iPhone。《Flappy Bird》于 2013 年发布&#xff0c;很快就获得了数千万次下载。然而&#xff0c;这款游戏在2014 年突然从 App Store 下架&#xff0c;原因是其越南开发者…...

Flutter类

Dart中的对象都继承自 Object 类&#xff0c;单继承&#xff08;extend关键字&#xff09;。Dart与Java、kotlin不同的是其无public、private、protected修饰符&#xff0c;默认public &#xff0c;通过在属性名、方法名前加 _下划线 来定义是否私有。 实现一个简单的类 class…...

深入解析全连接层:PyTorch 中的 nn.Linear、nn.Parameter 及矩阵运算

文章目录 数学概念&#xff08;全连接层&#xff0c;线性层&#xff09;nn.Linear()nn.Parameter()Q1. 为什么 self.weight 的权重矩阵 shape 使用 ( out_features , in_features ) (\text{out\_features}, \text{in\_features}) (out_features,in_features)而不是 ( in_featur…...

缓存对象反序列化失败

未定义serialVersionUID&#xff0c;会自动生成序列化号 新增了属性&#xff0c;序列号就变了&#xff0c;导致缓存对象反序列化失败。 所有缓存对象必须指定序列化id&#xff01; 那我如何找到未添加字段前 对象的序列化号呢&#xff1f;默认的序列化号是如何生成的呢&#…...

F28335的存储器与寄存器

1 存储器及CMD文件的编写 1 F28335的存储器 1.1 F28335存储器的结构 1.2 F28335存储器的映像 存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。 我们将《tms320f28335 数据手册》中“3.1…...

Python在AOIP(Audio Over IP)方面的应用探讨

Python在AOIP&#xff08;Audio Over IP&#xff09;方面的应用探讨 引言 随着网络技术的发展&#xff0c;音频传输逐渐向基于IP的解决方案迁移。音频通过互联网进行传输被称为音频过IP&#xff08;Audio Over IP&#xff0c;简称AOIP&#xff09;。这种技术在广播、现场活动…...

C++20标准对线程库的改进:更安全、更高效的并发编程

引言 C20 是 C 语言的一个重要里程碑&#xff0c;它引入了许多新特性&#xff0c;其中就包括对线程库&#xff08;thread&#xff09;的重大改进。这些改进不仅增强了语言的并发编程能力&#xff0c;还解决了先前版本中的一些痛点问题。本文将详细介绍 C20 在线程方面的改进&a…...

外包干了三年,快要废了。。。

先简单说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了3年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…...

微服务网关终极进化:设计模式驱动的性能与可用性优化(四)

时间&#xff1a;2024年09月12日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋推荐一下&#xff0c;小蒋希望遇到一个认真做事的团队&#xff0c;一起努力…...

Java中的服务端点日志记录:AOP与SLF4J

Java中的服务端点日志记录&#xff1a;AOP与SLF4J 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java后端服务开发中&#xff0c;日志记录是监控和调试应用的关键手段。通过合理使用AOP&…...

黑马头条第八天实战(上)

D8 1&#xff09;登录功能需求说明 用户根据用户名和密码登录密码需要手动加盐验证需要返回用户的token和用户信息 2&#xff09;模块搭建思路步骤 2.1&#xff09;模块作用 先捋一下之前搭模块干了啥 feign-api 远程调用 自媒体保存时调用远程客户端进行增加文章&#x…...

swift qwen2-vl推理及加载lora使用案例

参考: https://swift.readthedocs.io/zh-cn/latest/Instruction/LLM%E5%BE%AE%E8%B0%83%E6%96%87%E6%A1%A3.html#%E5%BE%AE%E8%B0%83%E5%90%8E%E6%A8%A1%E5%9E%8B https://blog.csdn.net/weixin_42357472/article/details/142150209 SWIFT支持300+ LLM和50+ MLLM(多模态大模型…...

如何使用 Choreographer 进行帧率优化

Choreographer 是 Android 提供的一个工具类&#xff0c;专门用来协调 UI 帧的渲染。你可以通过 Choreographer 来精确控制帧的绘制时机&#xff0c;以优化帧率&#xff0c;确保应用的流畅度。以下是如何使用 Choreographer 进行帧率优化的详细步骤&#xff1a; 1. 理解 Chore…...

Closure Library调试技巧:10个高效调试方法提升开发效率

Closure Library调试技巧&#xff1a;10个高效调试方法提升开发效率 【免费下载链接】closure-library Googles common JavaScript library 项目地址: https://gitcode.com/gh_mirrors/cl/closure-library Closure Library是Google开发的强大JavaScript库&#xff0c;提…...

OpenClaw 的模型服务是否支持基于策略的流量控制?

关于OpenClaw模型服务是否支持基于策略的流量控制&#xff0c;这个问题其实触及了现代AI服务部署中一个相当核心的环节。直接说结论的话&#xff0c;答案是肯定的&#xff0c;但更值得探讨的是它具体如何实现&#xff0c;以及这种支持在实际场景中意味着什么。 在技术架构层面&…...

不止于画图:用@antv/g6-editor的Command系统打造可撤销/重做的智能流程设计器

超越基础绘图&#xff1a;利用antv/g6-editor构建企业级智能流程设计器 在当今快速发展的数字化时代&#xff0c;流程设计工具已成为企业数字化转型的核心组件。从简单的审批流程到复杂的业务编排&#xff0c;一个功能完备的流程设计器不仅能提升工作效率&#xff0c;更能确保…...

大麦抢票神器:3步轻松实现演唱会门票自动化抢购终极指南

大麦抢票神器&#xff1a;3步轻松实现演唱会门票自动化抢购终极指南 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到心仪演唱会门票而烦…...

HZ-WAVES系列波浪传感器:解锁海洋数据采集的智能新方案

1. 海洋数据采集的痛点与智能化破局 海洋观测一直是科研和工程领域的硬骨头。记得我第一次参与海上作业时&#xff0c;传统波浪测量设备给我们带来了不少麻烦——笨重的机械结构、复杂的安装流程、动不动就罢工的电子元件&#xff0c;还有那让人头疼的数据传输延迟。最要命的是…...

从Type-C到CH347F:手把手教你设计一块与众不同的STM32H743开发板(附完整原理图)

从Type-C到CH347F&#xff1a;打造高集成度STM32H743开发板的实战指南 当市面上充斥着千篇一律的STM32开发板时&#xff0c;如何设计一款既能满足高性能需求又能简化开发流程的差异化产品&#xff1f;本文将带你深入探索基于STM32H743和CH347F芯片的开发板设计全过程&#xff…...

别再为Allegro导图发愁了!手把手教你用RATA工具搞定BMP单色图转换(附像素调整避坑指南)

Allegro图片导入难题终极指南&#xff1a;从原理到实战的完整解决方案 在PCB设计领域&#xff0c;Allegro作为行业标杆工具&#xff0c;却有一个让无数工程师头疼的"阿喀琉斯之踵"——图片导入功能。无论是公司Logo、结构示意图还是特殊标识&#xff0c;当我们需要将…...

高效掌控暗影精灵设备:开源工具OmenSuperHub的四大突破

高效掌控暗影精灵设备&#xff1a;开源工具OmenSuperHub的四大突破 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 告别原厂软件臃肿困扰&#xff0c;体验纯净硬件控制新方式 OmenSuperHub是一款专为惠普暗影精灵笔记本打造…...

【MATLAB实战:从BCI Competition IV 2a数据加载到预处理全流程】

1. 初识BCI Competition IV 2a数据集 第一次接触脑机接口&#xff08;BCI&#xff09;研究时&#xff0c;最让人头疼的就是数据预处理。BCI Competition IV 2a数据集作为入门级黄金标准&#xff0c;包含了9名受试者的EEG数据&#xff0c;记录了左手、右手、双脚和舌头四种运动想…...

从1M到1T1M:忆阻器阵列结构演进史及其在AI芯片中的应用前景

从1M到1T1M&#xff1a;忆阻器阵列结构演进史及其在AI芯片中的应用前景 在半导体技术持续突破的今天&#xff0c;忆阻器阵列正以其独特的物理特性重新定义计算架构的边界。这种兼具存储与计算能力的纳米级器件&#xff0c;正在神经网络加速领域展现出颠覆性潜力。本文将带您穿越…...