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…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
