Redis 的 key 的过期策略是怎么实现的【经典面试题】

前言

        在 Redis 中可以通过命令 expire 对指定的 key 值设置过期时间,在时间到了以后该键值对就会自动删除。

        一个 Redis 中可能会存在很多的 key ,而这些 key 中有很大的一部分都会有过期时间,那么 Redis 怎么知道哪些 key 已经到了过期时间需要删除,哪些 key 还没到过期时间呢?

        有读者可能会说,遍历不就得了,遍历 Redis 中所有的数据,就知道哪些数据已经到时间需要删除,哪些数据还没到时间。但这个方法显然是不行的,因为遍历一遍 Redis 中所有的数据非常的消耗时间和资源,而且还需要不停的遍历。

实现策略

        redis 整体的策略是:1.惰性删除  2.定期删除

惰性删除

        当一个 key 已经到过期时间时,暂时不删除该键值对,直到下次用户访问这个 key 值,才发现该 key 值已经过期,系统就顺便将该键值对删除,并且返回给用户 nil ,表示数据不存在。

定期删除

        规定一个定期删除数据的时间,比如每周删一次,并且删除过程中不是遍历 Rrdis 中所有的键值对,而是抽取一部分键值对,将其中过期的键值对进行删除,要保证定期删除的过程要足够快

        为什么对定期删除的速度有较高的要求呢?

        因为如果定期删除需要遍历 Redis 中所有的数据,将全部过期的键值对都找出来进行删除,那么在 Redis 中的数据很多的情况下,这个过程就会持续很久,而 Redis 是单线程的程序,此时在进行定期删除时,无法同时处理用户传来的请求,这就会导致阻塞,Redis 通常作为缓存,那么如果 Redis 出现了阻塞,就会导致大量的用户请求涌入数据库,很可能导致数据库直接挂掉,会造成很大的损失。

补充

        虽然有了上述的两种策略结合但整体的效果一般,仍然可能有许多过期的 key 值残留,没有被及时删除掉,redis 为了对上述进行补充,还用到了许多的内存淘汰策略

定时删除

        可能有某些文章会提到 Redis 使用了定时删除的策略,但这里明确的说,Redis 中并没有用到定时删除的策略,但定时删除也是可以实现 key 的过期策略的,而且也比较优秀,这里来简单介绍一下

        定时器:在指定的时间到达后,执行对应的任务

        假设在设置 key 的过期时间的同时,为该 key 创建一个定时器,让定时器在 key 的过期时间来临时将 key 删除

        优点:保证内存被尽快的释放

        缺点:如果过期的 key 很多,删除这些 key 就会消耗很多的 CPU 资源。定时器的创建很消耗时间和资源,若为每一个有过期时间的 key 都创建一个定时器,将会有大量的定时器产生,性能影响严重

        要想高效的通过定时删除实现 key 的过期策略,有两个比较优秀的方法

1.基于优先级队列/堆

        优先级队列也叫堆,分为大根堆和小根堆,堆顶的数据是最大/最小的。

        假设现在有许多的 key 都设置了过期时间,将这些 key 都添加到优先级队列中,指定优先级规则为 key 的过期时间最早的在堆顶,也就是以 key 的过期时间来建立小根堆

        由于在优先级队列中,堆顶的 key 是过期时间最早的,所以只要堆顶的 key 还没过期,其他的 key 也不会过期,此时定时器中只要分配一个线程,让这个线程去检查堆顶元素是否过期即可,此时线程不需要遍历所有的 key

        另外,线程检查堆顶元素是否过期也不能检查得太频繁,因为要是不停的去检查堆顶元素是否过期浪费了许多的 CPU 资源,好的做法是,根据当前时刻和堆顶元素的过期时间来设置一个等待时间,当等待时间到了以后,再唤醒线程

        但此时会出现一个问题,如果在线程等待的时候,有一个新的 key 值插入堆,并且过期时间比堆顶 key 的过期时间还早,那么线程要是还继续等待的话,堆顶的 key 已经过期很久了,所以当有新的 key 插入时,要唤醒线程,key 插入以后重新根据当前的时间和堆顶 key 的过期时间来设置线程的等待时间

2.基于时间轮来实现定时删除

        

        把时间划分成很多的小段,划分的粒度看具体的要求,每个小段上都挂着一个链表,每个链表表示一个要执行的任务,假设需要添加一个 key,这个 key 在 300 ms 后过期,那么这个 key 就会挂在 3 号链表上,如果 key 的过期时间很长,假设有 600 ms,那么就循环,挂在 1 号 链表上

        在时间轮上,有一个指针,从 1 号链表开始遍历,每走到一个链表,就把这个链表上的 key 检查一下,看有没有过期的,有过期的就删除,然后继续遍历。

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

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

相关文章

大语言模型系列-中文开源大模型

文章目录 前言一、主流开源大模型二、中文开源大模型排行榜 前言 近期,OpenAI 的主要竞争者 Anthropic 推出了他们的新一代大型语言模型 Claude 3,该系列涵盖了三个不同规模的模型:Opus、Sonnet 和 Haiku。 Claude 3声称已经全面超越GPT-4。…

Python AI 之Stable-Diffusion-WebUI

Stable-Diffusion-WebUI简介 通过Gradio库,实现Stable Diffusion web 管理接口 Windows 11 安装Stable-Diffusion-WebUI 个人认为Stable-Diffusion-WebUI 官网提供的代码安装手册/自动安装不适合新手安装,我这边将一步步讲述我是如何搭建Python Conda…

WorkPlus Meet提供高效、安全视频会议解决方案

WorkPlus Meet是一款私有部署和定制化的视频会议解决方案,为企业提供高效、安全的远程协作平台。随着全球数字化转型的加速,视频会议已成为企业必不可少的工作工具,而WorkPlus Meet的私有部署和定制化功能,为企业提供了更大的控制…

HYBBS 表白墙网站PHP程序源码,支持封装成APP

PHP表白墙网站源码,适用于校园内或校区间使用,同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装,只需PHP版本5.6以上即可。 通过上传程序进行安装,并设置账号密码,登录后台后切换模板,适配手机和PC…

2024年最新阿里云和腾讯云云服务器价格租用对比

2024年阿里云服务器和腾讯云服务器价格战已经打响,阿里云服务器优惠61元一年起,腾讯云服务器61元一年,2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比,阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

Kotlin:枚举类

点击查看枚举类中文文档 点击查看枚举类英文文档 枚举类的最基本的用法是实现类型安全的枚举: enum class Direction {NORTH, SOUTH, WEST, EAST }每个枚举常量都是一个对象。枚举常量用逗号分隔。 初始化 因为每一个枚举都是枚举类的实例,所以他们可…

Sass语法小册-笔记迁移

Sass 1、extend 一个元素使用的样式与另一个元素完全相同,但又添加了额外的样式。 .a{width: 100px;height: 100px;background-color: greenyellow;} .b{extend .a;background-color: orangered;//覆盖.a继承来的背景色 } 结果-》 .b[data-v-5d9daadb] {backgrou…

Github 2024-03-11 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-03-11统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目3Jupyter Notebook项目3C#项目1HTML项目1CSS项目1Dart项目1Lua项目1Shell项目1Rust项目1Java项目1C++项目1屏幕截图转…

HTML 语义化:构建优质网页的关键

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

蓝桥杯真题讲解:整数删除

蓝桥杯真题讲解&#xff1a;整数删除 一、视频讲解二、暴力代码三、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;整数删除 二、暴力代码 // 暴力模拟 #include<bits/stdc.h> #define int long long #define INF 0x3f3f3f3f3f3f3f using namespace std; const in…

Java后端八股文之Redis

文章目录 1. Redis是什么&#xff1f;2. Redis为什么这么快&#xff1f;3. 为什么要使用缓存&#xff1f;4. Redis几种使用场景&#xff1a;5. Redis的Zset底层为什么要使用跳表而不是平衡树、红黑树或者B树&#xff1f;6.Redis持久化6.1 什么是RDB持久化6.1.1RDB创建快照会阻塞…

蓝桥杯[OJ 1621]挑选子串-CPP-双指针

目录 一、题目描述&#xff1a; 二、整体思路&#xff1a; 三、代码&#xff1a; 一、题目描述&#xff1a; 二、整体思路&#xff1a; 要找子串&#xff0c;则必须找头找尾&#xff0c;找头可以遍历连续字串&#xff0c;找尾则是要从头的基础上往后遍历&#xff0c;可以设头…

STM32 学习11 独立看门狗与窗口看门狗

STM32 学习11 独立看门狗与窗口看门狗 一、**看门狗概述**二、**STM32中的看门狗类型**1. 独立看门狗&#xff08;IWDG&#xff09;&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;独立看门狗框图&#xff08;3&#xff09;独立看门狗配置步骤&#xff08;4&#…

【机器学习】科学库使用第1篇:机器学习(常用科学计算库的使用)基础定位、目标【附代码文档】

机器学习&#xff08;科学计算库&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位、目标&#xff0c;机器学习概述&#xff0c;1.1 人工智能概述&#xff0c;1.2 人工智能发展历…

ChatGPT国内能用吗?中国用户怎么才能使用ChatGPT?

与ChatGPT类似的国内网站&#xff0c;他们都能提供和ChatGPT相似的能力&#xff0c;而且可以在国内直接使用。 点击直达方式 百科GPT官网&#xff1a;baikegpt.cn ChatGPT是基于GPT-3.5架构的语言模型的一个实例&#xff0c;由OpenAI开发。以下是ChatGPT的发展历史&#xff1…

linux_aarch64_qt环境搭建

平台环境&#xff1a; ubuntu 16.04&#xff1a; gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) aarch64 gnu gcc版本&#xff1a; gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz Qt交叉编译版本: qt-everywhere-src-5.12.9.tar.xz 一、aarch64编…

信息系统项目管理师009:消费互联网(1信息化发展—1.3现代化创新发展—1.3.3 消费互联网)

文章目录 1.3.3 消费互联网1.基本属性2.应用新格局 1.3.3 消费互联网 消费互联网是以个人为用户&#xff0c;以日常生活为应用场景的应用形式&#xff0c;满足消费者在互联网中的消费需求而生的互联网类型。消费互联网以消费者为服务中心&#xff0c;针对个人用户提升消费过程的…

Elastic Stack--08--SpringData框架

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SpringData[官网&#xff1a; https://spring.io/projects/spring-data](https://spring.io/projects/spring-data) Spring Data Elasticsearch 介绍 1.SpringData-…

什么是数据采集与监视控制系统(SCADA)?

SCADA数据采集是一种用于监控和控制工业过程的系统。它可以实时从现场设备获得数据并将其传输到中央计算机&#xff0c;以便进行监控和控制。SCADA数据采集系统通常使用传感器、仪表和控制器收集各种类型的数据&#xff0c;例如温度、压力、流量等&#xff0c;然后将这些数据汇…

Java 使用 EasyExcel 实现导入导出(新手篇教程)

官网镇楼↓&#xff0c;觉得我写的不好的同学可以去官网看哦 EasyExcel Maven <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.3</version> </dependency> Excel 导入 示例&…