Redis的Key的过期策略是怎样实现的?

在学习Redis时,我们知道可以设置Key的过期时间,我们还知道,Redis一大特点--速度快

那么当Redis中的数据量起来时,如果直接遍历所有的Key,那么对于Key过期时间的校验应该很费时间,那么Redis究竟是怎样做的呢?本文就来探讨关于Redis中的Key的过期册策略。

Redis中的过期策略有两种 定期删除和惰性删除

Redis的过期策略

一、定期删除

每次抽取一部分,进行过期时间的校验。

注意: Redis是单线程服务器 ,主要的任务是处理业务需求,而不是检验Key的过期时间。

所以对于定期删除的时间也是有要求的。

二、惰性删除

假设一个Key已经到了过期时间,但是暂时还没删除掉它,当下一次访问用到这个Key时,此时Redis服务器就会触发删除Key的操作,同时返回nil


虽然有了上述的两种删除策略,但仍可能会有大量过期的Key残留在Redis中,没有被及时删除


手动分割线

除了以上两种删除策略,我在这里还介绍一种删除策略:定时删除

定时删除

定义:在设置Key的过期时间时,为该Key创建一个定时器,让定时器在Key的过期时间来临时,对Key进行删除

但看定义,定时删除的优点就是 保证内存尽快被释放

那么为什么Redis不采用呢?

这我们就要来探讨探讨它的缺点了

  1. 当过期Key很多时,删除这些Key会占用很多的CPU时间,导致CPU不能将所有的时间来执行本来该执行的任务,浪费到删除Key的过程了
  2. 定时器的创建会严重影响机器性能。当存在大量的Key时,也就意味的存在着同样数量的定时器,使计算机性能严重损耗

对于定时删除 的一些探究

定时器的改进:

  1. 可以采用优先级队列/堆的思想来优化定时器
  2. 采用时间轮的思想来优化定时器

优先级队列/堆

正常队列:先进先出

优先级队列的特点: 按照规定的优先级,先出队列

我们在Redis过期Key的场景中,可以规定"过期时间越早,优先级越高",按照这样的规定,此时定时器只需要分配一个线程,不断的检查队首元素,查看队首元素是否过期

此时 扫描线程 不需要遍历所有的Key 只需要观察队首元素即可

当然,在检查队首元素这个过程中,也不能太过于频繁,过于频繁也会消耗CPU资源

此时的解决方案就是根据当前时刻和队首元素的过期时间,设置一个等待时间(sleep/wait,知识点来了,sleep和wait有什么区别)

此时,CPU的开销也就小了许多

时间轮

把时间划分成许多小段,按照某个方向进行旋转,

对于时间轮的格子数量,每个格子的时间都是根据实际的业务来确定的。


以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!💞💞💞

相关推荐
枫叶丹45 分钟前
破局政务数字化核心难题:金仓数据库以国产化方案引领电子证照系统升级之路
数据库·政务·1024程序员节·金仓
托比-马奎尔7 分钟前
Redis主从集群
数据库·redis·缓存
码力引擎1 小时前
【零基础学MySQL】第一章:MySQL介绍与安装
数据库·mysql·1024程序员节
小超嵌入式笔记1 小时前
【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】
java·数据库·mongodb
hweiyu002 小时前
Node.js+Koa2+MySQL 打造前后端分离项目(视频教程)
数据库·mysql·node.js
isNotNullX3 小时前
一文讲清:数据清洗、数据中台、数据仓库、数据治理
大数据·网络·数据库·数据分析·1024程序员节
penguin_bark3 小时前
C++调用MySQL数据库完整教程
数据库·c++·mysql
曾凡宇先生3 小时前
无法远程连接 MySQL
android·开发语言·数据库·sql·tcp/ip·mysql·adb
苏小瀚3 小时前
[MySQL] 事务和视图
数据库·mysql·1024程序员节
前端橙一陈4 小时前
彻底理解 Bootstrap 的响应式断点机制:从 CSS 到 SCSS 的实现原理
css·bootstrap·scss