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

深入了解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)如何处理的策略。主要有两种过期策略:

  1. 惰性过期(Lazy Expiration): 当客户端尝试访问一个键时,Redis会检查该键是否过期,如果过期则会立即删除。这种方式下,过期键的检查和删除是在键被访问时进行的,因此存在一定的延迟。

  2. 定期过期(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)

  1. 惰性过期 vs 定期过期:

    • 惰性过期适合对实时性要求不高的场景,可以减少对Redis的额外负担。
    • 定期过期适合对实时性要求较高的场景,可以保证过期键及时清理,防止内存占用过多。
  2. 根据数据访问模式选择:

    • 如果系统中的数据访问模式不太规律,即有些数据长时间不被访问,有些数据频繁被访问,可以选择定期过期策略。
    • 如果系统中的数据访问模式较为平均,即数据的访问频率较为均匀,可以选择惰性过期策略。

内存淘汰机制(Eviction Policies)

  1. LRU vs LFU vs 随机淘汰:

    • LRU(最近最少使用)淘汰机制适合对访问模式有时间相关性的场景,即最近被访问的数据很可能会再次被访问。
    • LFU(最不经常使用)淘汰机制适合对访问模式有频率相关性的场景,即访问频率低的数据可能很少被再次访问。
    • 随机淘汰适合对数据的淘汰没有特定的规律或要求的场景,可以简单、高效地释放内存。
  2. 根据业务需求和数据特点选择:

    • 如果系统中有些数据对实时性要求较高,可以选择LRU或LFU淘汰机制,保证热门数据的缓存命中率。
    • 如果系统中的数据淘汰没有特定的规律,可以选择随机淘汰机制,保证内存使用的平稳性。

监控和调优

  1. 实时监控系统状态: 定期监控系统的内存使用情况、键的过期情况以及淘汰机制的效果。
  2. 根据监控结果进行调优: 根据监控结果调整过期策略和淘汰机制的配置参数,以达到更好的性能和资源利用率。

综合考虑

综合考虑业务需求、数据特点和系统性能,选择合适的过期策略和内存淘汰机制,并通过监控和调优来优化系统性能。在选择过程中,可以根据实际情况进行灵活调整,以满足不同场景下的需求。

总结

通过了解Redis的过期策略和内存淘汰机制,我们可以更好地优化Redis的使用。合理选择过期策略和内存淘汰机制,可以提高系统的性能和稳定性,减少资源的浪费,从而更好地满足不同场景下的需求。

相关文章:

  • 5月27日
  • Spring Boot中如何实现定时任务?
  • el-select 组件获取整个对象
  • 模型实战(20)之 yolov8分类模型训练自己的数据集
  • yolov8+ROS+ubuntu18.04——学习记录
  • Redis篇 String
  • .Net Core 中间件与过滤器
  • 02 FreeRTOS 任务
  • PyCharm面板ctrl+鼠标滚轮放大缩小代码
  • 基于Pytorch框架的深度学习ShufflenetV2神经网络十七种猴子动物识别分类系统源码
  • three.js官方案例webgl_loader_fbx.html学习
  • Docker打包之后如何将进行变成压缩包进行传输和使用?
  • XSKY CTO 在英特尔存储技术峰会的演讲:LLM 存储,架构至关重要
  • 人脸识别技术的前沿技术和应用场景
  • 华为交换机、路由器开局(基础配置及远程登录)
  • python docx文档转html页面
  • Redux 中间件分析
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue-cli在webpack的配置文件探究
  • windows下使用nginx调试简介
  • zookeeper系列(七)实战分布式命名服务
  • 目录与文件属性:编写ls
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 智能网联汽车信息安全
  • Java总结 - String - 这篇请使劲喷我
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​人工智能书单(数学基础篇)
  • # C++之functional库用法整理
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (备忘)Java Map 遍历
  • (苍穹外卖)day03菜品管理
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (三)uboot源码分析
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (五)网络优化与超参数选择--九五小庞
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)Linux网络编程入门
  • .Net 4.0并行库实用性演练
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .Net各种迷惑命名解释
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET实现之(自动更新)
  • @EnableAsync和@Async开始异步任务支持