深入了解Redis的过期策略和内存淘汰机制
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨
🎈🎈作者主页: 喔的嘛呀🎈🎈
✨✨ 帅哥美女们,我们共同加油!一起进步!✨✨
目录
引言
一、过期策略(Expiration Policies)
1、惰性过期(Lazy Expiration)
2、定期过期(TTL-Based Expiration)
二、内存淘汰机制(Eviction Policies)
LRU(Least Recently Used)
LFU(Least Frequently Used)
随机淘汰(Random)
总结
三、如何选择合适的过期策略和内存淘汰机制?
过期策略(Expiration Policies)
内存淘汰机制(Eviction Policies)
监控和调优
综合考虑
总结
引言
在使用Redis作为缓存或数据存储时,了解其过期策略和内存淘汰机制是至关重要的。这些机制不仅影响着Redis的性能和资源利用率,还直接关系到系统的稳定性和可用性。本文将深入探讨Redis的过期策略和内存淘汰机制,帮助读者更好地理解和优化Redis的使用。
一、过期策略(Expiration Policies)
Redis的过期策略指的是对于设置了过期时间(TTL)的键(key)如何处理的策略。主要有两种过期策略:
-
惰性过期(Lazy Expiration): 当客户端尝试访问一个键时,Redis会检查该键是否过期,如果过期则会立即删除。这种方式下,过期键的检查和删除是在键被访问时进行的,因此存在一定的延迟。
-
定期过期(TTL-Based Expiration): Redis会定期(以每秒钟十次的频率)随机抽样一部分过期键,并检查是否过期,然后删除过期键。这种方式下,Redis会主动进行过期键的检查和删除,从而保证了过期键的及时清理。
以下是使用Java编写的关于Redis过期策略的示例代码,包括惰性过期和定期过期。
使用Jedis库连接Redis
首先,我们需要使用Jedis库连接Redis服务器。确保您已经在项目中引入了Jedis库。
import redis.clients.jedis.Jedis;public class RedisExpirationPolicies {public static void main(String[] args) {// 连接Redis服务器Jedis jedis = new Jedis("localhost", 6379);// 测试Redis连接是否成功System.out.println("Connected to Redis server");}
}
1、惰性过期(Lazy Expiration)
惰性过期是指当客户端尝试访问一个键时,Redis会检查该键是否过期,如果过期则会立即删除。
// 设置键值对,并设置过期时间为10秒
jedis.setex("key", 10, "value");// 获取键值对
String value = jedis.get("key");
System.out.println("Value of 'key': " + value); // 如果在10秒内,打印出value,否则打印null// 等待10秒后再次获取键值对
Thread.sleep(10000);
value = jedis.get("key");
System.out.println("Value of 'key': " + value); // 打印null,键已过期被删除
2、定期过期(TTL-Based Expiration)
定期过期是指Redis会定期(以每秒钟十次的频率)随机抽样一部分过期键,并检查是否过期,然后删除过期键。
// 设置键值对,并设置过期时间为10秒
jedis.setex("key", 10, "value");// 获取键值对的剩余生存时间
long ttl = jedis.ttl("key");
System.out.println("TTL of 'key': " + ttl); // 打印剩余生存时间,单位为秒// 等待10秒后再次获取键值对的剩余生存时间
Thread.sleep(10000);
ttl = jedis.ttl("key");
System.out.println("TTL of 'key': " + ttl); // 打印-2,表示键已经不存在,过期键已被删除
通过以上Java示例代码,我们可以更好地理解Redis的过期策略。惰性过期会在键被访问时检查并删除过期键,而定期过期则是由Redis定期检查和删除过期键。
二、内存淘汰机制(Eviction Policies)
内存淘汰机制是指当Redis的内存使用达到上限时,Redis会根据一定的策略来删除一些键值对,以释放内存空间。常见的内存淘汰机制包括LRU(Least Recently Used,最近最少使用)、LFU(Least Frequently Used,最不经常使用)和随机淘汰。
下面我们将详细介绍这些内存淘汰机制及其在Redis中的应用。
LRU(Least Recently Used)
LRU淘汰机制是指删除最近最少被访问的键值对。当Redis的内存使用达到上限时,它会优先删除最久未被访问的键值对,以释放空间。
// 设置键值对
jedis.set("key1", "value1");
jedis.set("key2", "value2");// 获取键值对
String value1 = jedis.get("key1"); // 访问key1,将key1放到LRU队列的尾部
String value2 = jedis.get("key2");// 当内存不足时,Redis会优先删除最近最少被访问的键值对
LFU(Least Frequently Used)
LFU淘汰机制是指删除访问频率最低的键值对。当Redis的内存使用达到上限时,它会优先删除被访问频率最低的键值对,以释放空间。
// 设置键值对
jedis.set("key1", "value1");
jedis.set("key2", "value2");// 增加对key1的访问频率
for (int i = 0; i < 100; i++) {jedis.get("key1");
}// 当内存不足时,Redis会优先删除访问频率最低的键值对
随机淘汰(Random)
随机淘汰是指随机选择一个键值对进行删除。当Redis的内存使用达到上限时,它会随机选择一个键值对进行删除,以释放空间。
// 设置键值对
jedis.set("key1", "value1");
jedis.set("key2", "value2");// 当内存不足时,Redis会随机选择一个键值对进行删除
总结
以上就是Redis中常见的内存淘汰机制。根据业务需求和系统特点,可以选择合适的淘汰机制来保证系统的性能和稳定性。例如,对于需要保持较高访问速度的系统,可以选择LRU淘汰机制;对于需要保证数据的新鲜度的系统,可以选择LFU淘汰机制;而随机淘汰则是一种简单且效率较低的淘汰机制,适用于一些特定场景。
三、如何选择合适的过期策略和内存淘汰机制?
选择合适的过期策略和内存淘汰机制取决于具体的业务需求、系统特点和性能要求。以下是一些指导原则,可以帮助您选择适合您应用的策略和机制:
过期策略(Expiration Policies)
-
惰性过期 vs 定期过期:
- 惰性过期适合对实时性要求不高的场景,可以减少对Redis的额外负担。
- 定期过期适合对实时性要求较高的场景,可以保证过期键及时清理,防止内存占用过多。
-
根据数据访问模式选择:
- 如果系统中的数据访问模式不太规律,即有些数据长时间不被访问,有些数据频繁被访问,可以选择定期过期策略。
- 如果系统中的数据访问模式较为平均,即数据的访问频率较为均匀,可以选择惰性过期策略。
内存淘汰机制(Eviction Policies)
-
LRU vs LFU vs 随机淘汰:
- LRU(最近最少使用)淘汰机制适合对访问模式有时间相关性的场景,即最近被访问的数据很可能会再次被访问。
- LFU(最不经常使用)淘汰机制适合对访问模式有频率相关性的场景,即访问频率低的数据可能很少被再次访问。
- 随机淘汰适合对数据的淘汰没有特定的规律或要求的场景,可以简单、高效地释放内存。
-
根据业务需求和数据特点选择:
- 如果系统中有些数据对实时性要求较高,可以选择LRU或LFU淘汰机制,保证热门数据的缓存命中率。
- 如果系统中的数据淘汰没有特定的规律,可以选择随机淘汰机制,保证内存使用的平稳性。
监控和调优
- 实时监控系统状态: 定期监控系统的内存使用情况、键的过期情况以及淘汰机制的效果。
- 根据监控结果进行调优: 根据监控结果调整过期策略和淘汰机制的配置参数,以达到更好的性能和资源利用率。
综合考虑
综合考虑业务需求、数据特点和系统性能,选择合适的过期策略和内存淘汰机制,并通过监控和调优来优化系统性能。在选择过程中,可以根据实际情况进行灵活调整,以满足不同场景下的需求。
总结
通过了解Redis的过期策略和内存淘汰机制,我们可以更好地优化Redis的使用。合理选择过期策略和内存淘汰机制,可以提高系统的性能和稳定性,减少资源的浪费,从而更好地满足不同场景下的需求。
相关文章:
深入了解Redis的过期策略和内存淘汰机制
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…...
小白不知道怎么投稿?记住这个好方法
作为一名单位信息宣传员,我最初踏上这条道路时,满心憧憬着通过文字传递我们单位的精彩瞬间,让社会听见我们的声音。然而,理想与现实之间的距离,却在一次次邮箱投稿的石沉大海中渐渐清晰。那时的我,像所有“小白”一样,以为只要用心撰写稿件,通过电子邮件发给各大媒体,就能收获满…...
gRPC - Protocol Buffer 编译器安装
文章目录 Protocol Buffer 编译器安装如何安装 Protocol Buffer 编译器使用包管理器安装Linux 上,使用 apt 或 apt-get,例如:macOS 上,使用 Homebrew: 安装预编译的二进制文件(任何操作系统)其他…...
【Linux】centos7下载安装Python3.10,下载安装openssl1.1.1
目录 centos7下载安装Python(版本3.10.14) (1)网页下载python压缩包,并解压缩 (2)编译安装 Python在make altinstall时,报错及解决 (3)将安装目录和可执…...
通过 python 操作mongodb
库引入 Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。 import pymongo 链接数据库 创建数据库需要使用 MongoClient 对象,并且指定连接的ip和端口号。 myclientpymongo.MongoClient("localhost",27017)#连接…...
若依框架对于后端返回异常后怎么处理?
1、后端返回自定义异常serviceException 2、触发该异常后返回json数据 因为若依对请求和响应都封装了,所以根据返回值response获取不到Code值但若依提供了一个catch方法用来捕获返回异常的数据 3、处理的方法...
vs code怎么补全路径,怎么快捷输入文件路径
安装插件: 链接:https://marketplace.visualstudio.com/items?itemNamejakob101.RelativePath 使用 按住 Ctrl Shift H,弹出窗口,输入文件补全,回车就可以了 排除文件 如果你的项目下文件太多,它会…...
git分支开发主干合并流程
文章目录 一、分支开发二、主干合并三、删除合并过的分支 一、分支开发 创建分支git branch <分支名> # git branch my_new_branch开发后提交代码git commit -m 本次开发内容 # git commit -m 增加登录保持功能同步远端仓库git push origin <分支名> # git push o…...
01Python相关基础学习
Python基础 模块相关导入模块sys模块 模块相关 导入模块 1. import 模块名 2. import 模块名 as 别名 3. from 模块名 import 成员名 as 别名sys模块 1. sys.argv 介绍: 实现从程序的外部想程序传递参数返回的是一个列表,第一个元素是程序文件名,第二个元素是程序外部传入的…...
InTouch历史报警、历史事件按时段查询,导出
简介:本插件基于上位机组态InTouch的历史报警、操作记录而开发 适用InTouch版本:不限 适用Windows系统:不限 适用数据库:SQL Server 标记名点数:不限 配套软件安装:Excel、WPS、SQL Server 功能&…...
网络攻防概述(基础概念)
文章目录 APTAPT概念APT攻击过程 网络空间与网络空间安全网络空间(Cyberspace)网络空间安全(Cyberspace Security) 网络安全属性机密性(Confidentiality或Security)完整性(Integrity)可用性(Availability)不可否认性(Non-repudiation…...
了解Java垃圾收集
Java 的垃圾收集机制在 Java 应用程序开发中至关重要。此机制对于通过消除不再使用的对象来释放内存空间得过程来说至关重要。在这篇文章中,我带大家深入了解下 Java 垃圾收集的机制,并探索其工作原理、优点以及实现最佳性能的最佳实践。 1.什么是 Java…...
快速搭建 WordPress 外贸电商网站指南
本指南全面解析了在 Hostinger 平台上部署 WordPress 外贸电商网站的详细步骤,涵盖托管方案选择、WordPress 一键安装、主题挑选与演示数据导入、主题个性化定制、SEO插件插件 AIOSEO 安装、通过 GTranslate 实现多语言自动翻译、地区访问控制插件,助力用…...
网络编程 —— Http进度条
第一种下载带进度的方法 string url "https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi"; 1使用getASync获取服务器响应数据 参数1请求的路径, 参数2 HttpCompletionOption.ResponseHeadersRead 请求完成时候等待请求带什么程度才…...
5月26(信息差)
🌍 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来! 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来! 🎄 Windows 11 Beta 22635.3646 预览版发布:中国大陆地区新增“微软电脑管家”应用 ✨ 成都限购解除即将满…...
【Redis】持久化操作详解
Redis 持久化操作详解 Redis 实现持久化的时候,具体是按照什么样的策略来实现的呢? Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种&…...
C#调用HttpClient.SendAsync报错:System.Net.Http.HttpRequestException: 发送请求时出错。
C#调用HttpClient.SendAsync报错:System.Net.Http.HttpRequestException: 发送请求时出错。 var response await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);问题出在SSL/TLS,Windows Server 2012不支持…...
大模型基础知识
文章目录 1. 位置编码1.1 绝对位置编码1.2 相对位置编码1.3 旋转位置编码2. 注意力机制2.1 MHA(muti head attention)2.2 MQA(muti query attention)2.3 GQA(grouped query attention)3. 大模型分类4. 微调方法4.1 Prompt Tuning4.2 Prefix Tuning4.3 Lora4.4 QLora5. La…...
时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)
目录 引言 LSTM的预测效果图 LSTM机制 了解LSTM的结构 忘记门 输入门 输出门 LSTM的变体 只有忘记门的LSTM单元 独立循环(IndRNN)单元 双向RNN结构(LSTM) 运行代码 代码讲解 引言 LSTM(Long Short-Term Memory)是一种常用的循环神经网络&a…...
[8] CUDA之向量点乘和矩阵乘法
CUDA之向量点乘和矩阵乘法 计算类似矩阵乘法的数学运算 1. 向量点乘 两个向量点乘运算定义如下: #真正的向量可能很长,两个向量里边可能有多个元素 (X1,Y1,Z1) * (Y1,Y2,Y3) X1Y1 X2Y2 X3Y3这种原始输入是两个数组而输出却缩减为一个(单一值)的运…...
区块链与计算机视觉融合:构建可信机器感知系统的架构与实践
1. 项目概述:当计算机视觉遇见区块链在人工智能的浪潮中,计算机视觉(CV)无疑是那颗最耀眼的明星之一。它让机器拥有了“看”和理解世界的能力,从医疗影像中精准定位病灶,到自动驾驶汽车识别路况,…...
Win-Vind终极指南:用Vim风格高效操作Windows的完整方案
Win-Vind终极指南:用Vim风格高效操作Windows的完整方案 【免费下载链接】win-vind You can operate Windows with key bindings like Vim. 项目地址: https://gitcode.com/gh_mirrors/wi/win-vind 还在为Windows操作效率低下而烦恼吗?想要在Windo…...
OpenCore Legacy Patcher终极指南:三步让老Mac焕发新生,轻松运行最新macOS
OpenCore Legacy Patcher终极指南:三步让老Mac焕发新生,轻松运行最新macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为老旧…...
混合基FFT,matlab实现
参考数字信号处理教程第四版(程佩青著)第四章FFT这里直接给出matlab函数,性能不保证最优注意,此函数只能处理混合基fft,即输入信号x的长度不能是素数,不能是2次幂整数function X mixedRadixFFT(x)% multiB…...
如何用Python快速接入Taotoken调用多模型API完成开发任务
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何用Python快速接入Taotoken调用多模型API完成开发任务 对于开发者而言,快速验证想法、构建原型是开发流程中的关键环…...
抖音内容自动化下载:3大技术挑战与实战解决方案
抖音内容自动化下载:3大技术挑战与实战解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...
USB Cheat Sheet:从物理层到协议栈的终极解码指南
USB Cheat Sheet:从物理层到协议栈的终极解码指南 USB,这个我们每天都在使用的接口,背后隐藏着远超想象的复杂技术体系。从1996年USB 1.0的1.5Mbps,到如今USB4 Version 2.0的80Gbps,传输速率提升了超过五万倍。但更让人…...
从BJT到CMOS:运放偏置电流的前世今生,以及它对高阻抗传感器电路设计的实际影响
从BJT到CMOS:运放偏置电流的前世今生,以及它对高阻抗传感器电路设计的实际影响 在精密测量领域,运算放大器的偏置电流就像一位隐形的"电流小偷",悄无声息地影响着测量精度。想象一下,当你试图测量一个微弱的…...
量子-经典混合计算平台架构:从监控溯源到弹性推理引擎
1. 项目概述:当量子计算遇见经典算力最近几年,我身边不少做高性能计算和AI的朋友,都开始把目光投向一个听起来有点“科幻”的领域——量子计算。但大家聊着聊着,总会回到一个非常现实的问题:我们实验室那台价值不菲的量…...
你的 FlashAttention 真的在跑吗?几个简单方法确认
之前有个朋友在昇腾 NPU 上部署模型,按文档开了 --enable-flash-attn,跑起来也没报错。但他总觉得延迟不对——跟之前没开的时候差不多。他问我:怎么确认 FlashAttention 真的生效了?不会是静默降级了吧? 这个问题问得…...
