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…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...