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 惰性删除…...

Golang | Leetcode Golang题解之第401题二进制手表
题目: 题解: 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(TheOpenNetwork)作为一个去中心化的区块链平台,其智能合约功能强大而灵活。在TON智能合约的开发过程中,stdlib.fc库提供了基础的功能支持。然而,对于一些高级或特定的需求,stdlib.fc可能无法满足。为此…...

LabVIEW开发FPGA方法与FIFO数据丢失处理
开发基于NI 7975R FPGA的系统涉及一系列流程,包括驱动安装、LabVIEW项目设置、开发调试、编译和与Windows系统的通信。重点在于FIFO的正确配置,避免数据丢失是关键环节之一,尤其是在使用高速数据流传输时。以下将详细介绍这些过程,…...
Python中的内存池机制
在Python中,内存管理是一个复杂但至关重要的主题,它直接关系到程序的性能和稳定性。Python的内存管理机制包括对象的分配、追踪以及回收,其中内存池(Memory Pool)是这一机制中的一个重要组成部分。内存池机制通过预先分…...

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

[数据集][目标检测]脊椎检测数据集VOC+YOLO格式1137张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1137 标注数量(xml文件个数):1137 标注数量(txt文件个数):1137 标注…...

大受欢迎的游戏却又意外被作者下架的《Flappy Bird》将重返iPhone
据"Flappy Bird 基金会"官网称,标志性的侧卷轴滚动游戏《Flappy Bird》将很快回归 iPhone。《Flappy Bird》于 2013 年发布,很快就获得了数千万次下载。然而,这款游戏在2014 年突然从 App Store 下架,原因是其越南开发者…...

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

深入解析全连接层:PyTorch 中的 nn.Linear、nn.Parameter 及矩阵运算
文章目录 数学概念(全连接层,线性层)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,会自动生成序列化号 新增了属性,序列号就变了,导致缓存对象反序列化失败。 所有缓存对象必须指定序列化id! 那我如何找到未添加字段前 对象的序列化号呢?默认的序列化号是如何生成的呢&#…...

F28335的存储器与寄存器
1 存储器及CMD文件的编写 1 F28335的存储器 1.1 F28335存储器的结构 1.2 F28335存储器的映像 存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。 我们将《tms320f28335 数据手册》中“3.1…...
Python在AOIP(Audio Over IP)方面的应用探讨
Python在AOIP(Audio Over IP)方面的应用探讨 引言 随着网络技术的发展,音频传输逐渐向基于IP的解决方案迁移。音频通过互联网进行传输被称为音频过IP(Audio Over IP,简称AOIP)。这种技术在广播、现场活动…...
C++20标准对线程库的改进:更安全、更高效的并发编程
引言 C20 是 C 语言的一个重要里程碑,它引入了许多新特性,其中就包括对线程库(thread)的重大改进。这些改进不仅增强了语言的并发编程能力,还解决了先前版本中的一些痛点问题。本文将详细介绍 C20 在线程方面的改进&a…...

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

微服务网关终极进化:设计模式驱动的性能与可用性优化(四)
时间:2024年09月12日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 希望大家帮个忙!如果大家有工作机会,希望帮小蒋推荐一下,小蒋希望遇到一个认真做事的团队,一起努力…...
Java中的服务端点日志记录:AOP与SLF4J
Java中的服务端点日志记录:AOP与SLF4J 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在Java后端服务开发中,日志记录是监控和调试应用的关键手段。通过合理使用AOP&…...

黑马头条第八天实战(上)
D8 1)登录功能需求说明 用户根据用户名和密码登录密码需要手动加盐验证需要返回用户的token和用户信息 2)模块搭建思路步骤 2.1)模块作用 先捋一下之前搭模块干了啥 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 提供的一个工具类,专门用来协调 UI 帧的渲染。你可以通过 Choreographer 来精确控制帧的绘制时机,以优化帧率,确保应用的流畅度。以下是如何使用 Choreographer 进行帧率优化的详细步骤: 1. 理解 Chore…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...