深入了解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的使用。合理选择过期策略和内存淘汰机制,可以提高系统的性能和稳定性,减少资源的浪费,从而更好地满足不同场景下的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql基础2多表查询

多表查询 多表关系: 一对多 案例: 部门 与 员工的关系 关系: 一个部门对应多个员工&#xff0c;一个员工对应一个部门 实现: 在多的一方建立外键&#xff0c;指向一的一方的主键 多对多 案例: 学生 与 课程的关系 关系: 一个学生可以选修多门课程&#xff0c;一门课程也可以…

RuleApp资源社区,知识付费社区,可对接typecho的小程序APP

强大的文章/社区/自媒体客户端&#xff0c;支持打包为安卓&#xff0c;苹果&#xff0c;小程序。包括文章模块&#xff0c;用户模块&#xff0c;支付模块&#xff0c;聊天模块&#xff0c;商城模块等基础功能&#xff0c;包含VIP会员&#xff0c;付费阅读等收费体系&#xff0c…

AttributeError: ‘_MSDataLoaderIter‘ object has no attribute ‘_put_indices‘

问题描述 复现代码过程中遇到错误&#xff1a;AttributeError: _MSDataLoaderIter object has no attribute _put_indices 解决方案 出错的原因是代码中使用了不存在的属性"_put_indices"。这个错误可能与你使用的版本不兼容有关。在pytorch1.x版本中&#xff0c;&q…

Django Ajax

【一】Json 【1】介绍 JSON&#xff08;javascript object otaition&#xff09;是一种轻量级的数据交换格式JSON使用了Javascript的一部分语法来定义其数据格式&#xff0c;但Json是独立于语言的Json采用完全独立于语言的文本格式&#xff0c;使得Json成为理想的数据交互语言…

react native 键盘事件

在做修改密码功能是发现他的键盘第一次调起之后然后收起键盘焦点不会消失而且键盘也不会再调起来了 我门线引入需要的组件 import { StyleSheet, View, TextInput, Keyboard, TouchableWithoutFeedback, } from react-native; import React, {useEffect, useState, useRef} fr…

[Halcon学习笔记]在Qt上实现Halcon窗口的字体设置颜色设置等功能

1、 Halcon字体大小设置在Qt上的实现 在之前介绍过Halcon窗口显示文字字体的尺寸和样式&#xff0c;具体详细介绍可回看 &#xff08;一&#xff09;Halcon窗口界面上显示文字的字体尺寸、样式修改 当时介绍的设定方法 //Win下QString Font_win "-Arial-10-*-1-*-*-1-&q…

MySQL学习笔记------SQL(2)

ziduanSQL DML 全称为&#xff1a;Data Manipulation Language&#xff0c;用来对数据库中表的数据记录进行增删改操作 插入数据 添加数据&#xff08;INSERT&#xff09; 给指定字段添加数据&#xff1a;INSERT INTO 表名(字段名1&#xff0c;字段名2&#xff0c;......…

【PyQt】19-数据操作

数据表 前言一、显示二维表数据&#xff08;QTableView控件&#xff09;扩展知识---MVC模式1.1 代码1.2 运行结果 二、显示列数据&#xff08;QListView控件&#xff09;2.1 代码2.2 运行结果2.3 扩展---列表控件&#xff08;QListWidget&#xff09;运行结果 总结 前言 一、显…

STM32使用滴答定时器实现delayms

在STM32上使用SysTick实现jiffies&#xff08;时间戳&#xff09;并且实现delay_ms 代码实现&#xff1a; volatile uint32_t jiffies 0; // 用于记录系统运行的jiffies数 void SysTick_Handler(void) {/* 每次SysTick中断&#xff0c;jiffies增加 */jiffies; }uint32_t tick…

unity无法使用道路生成插件Road Architect(ctrl和shift无法标点)

切换一下布局就行了。 附&#xff1a;Road Architect教学地址

游戏引擎中的地形系统

一、地形的几何 1.1 高度图 记录不同定点的高度&#xff0c;对每个网格/顶点应用高度、材质等信息&#xff0c;我们每个顶点可以根据高度改变位移 但是这种方法是不适用于开放世界的。很难直接画出几百万公里的场景 1.2 自适应网格细分 当fov越来越窄的时候&#xff0c;网格…

JavaEE企业级分布式高级架构师课程

教程介绍 本课程主要面向1-5年及以上工作经验的Java工程师&#xff0c;大纲由IT界知名大牛 — 廖雪峰老师亲自打造&#xff0c;由来自一线大型互联网公司架构师、技术总监授课&#xff0c;内容涵盖深入spring5设计模式/高级web MVC开发/高级数据库设计与开发/高级响应式web开发…

深度学习pytorch——GPU加速(持续更新)

使用 .to(device)&#xff0c;以前使用 .cuda() &#xff0c;但是现在基本不使用了。 代码示例&#xff1a; 查看电脑GPU运行情况&#xff1a; 使用Ctrl Shift ESC快捷键&#xff1a;

目标检测上的diffusion

1 Title DiffusionDet: Diffusion Model for Object Detection&#xff08;Shoufa Chen,Peize Sun,Yibing Song,Ping Luo&#xff09;【ICCV 2023】 2 Conclusion This study proposes DiffusionDet, a new framework that formulates object detection as a denoisin…

吴恩达2022机器学习专项课程(一) 3.3 成本函数的公式

问题预览 模型的参数&#xff08;w和b&#xff09;有什么作用&#xff1f;不同的w和b对线性回归模型有什么影响&#xff1f;训练集里的y和线性回归模型预测的y&#xff08;y帽&#xff09;的区别是什么&#xff1f;成本函数的作用是什么&#xff1f;成本函数的公式是什么&…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(六)—— 二元分类

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战演绎 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 这篇文章咱们将深度学习应用到另一个常见任务…

STM32学习笔记(6_1)- TIM定时器定时功能原理

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 现在开…

(ES6)前端八股文修炼Day2

1. let const var 的区别 var&#xff1a; var 是在 ES5 中引入的声明变量的关键字。 具有函数作用域&#xff0c;而不是块作用域&#xff0c;这意味着使用 var 声明的变量在函数内部是可见的。 变量可以被重复声明&#xff0c;而且变量的值可以在声明前使用&#xff0c;这可能…

jmeter链路压测

比如登录后返回token&#xff0c;业务打印上传的操作需要用到token 线程组中添加登录请求&#xff0c;并执行 1、添加登录并执行&#xff0c;查看结果 2、结果树中下拉选择正则表达式&#xff0c;将token参数和值复制粘贴到下方&#xff0c;将token值改为(.*?)&#xff0…

【Nebula笔记】简介及安装

目录 一、简介 (一) 什么是图数据库 二、安装 (一) 原生安装 (二) Docker & Docker compose 1. Docker安装 Linux Window 2. 部署NebulaGraph (三) to MAC 三、Nebula Graph Studio (一) 版本兼容性 (二) 原生安装 (三) Docker compose (四) 连接Nebula Gra…