php过期键的定期删除策略,Redis过期键的删除策略

Redis过期键的删除策略

Redis过期键的删除策略

Redis服务器中的每个数据库都由redisDb表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,这个字典就成为键空间:

typedef struct redisDb{

......

dict *dict;

......

}redisDb;

下图是一个数据库键空间的示例图:

0ec83947912d0fbfdf791f06c771b6aa.png

《Redis底层数据结构-字典》中详细地讲解过字典数据结构,字典包含多个键值对,字典的底层实现是哈希表,一个哈希表包含了多个哈希表节点,每个哈希表节点就保存了字典中的一个键值对。上图所示中,字典包含三个键值对,每个键中包含一个或多个值,键的对象类型是字符串对象,值的对象类型可以是字符串对象、列表对象、哈希对象、集合对象、有序集合对象,每个对象的至少包含两种底层数据结构。具体见《Redis五种数据类型的底层实现总结》

Redis有四种命令设置键的过期时间:

expire key ttl:将key的生存时间设置为ttl秒

pexpire key ttl:将key的生存时间设置为ttl毫秒

expireat key timestamp:将key的过期时间设置为timestamp所指定的秒数时间戳

pexpireat key timestamp:将key的过期时间设置为timestamp所指定的毫秒数时间戳

但是最终的底层实现都和pexpireat 命令一样

redisDb结构中的expires字典保存所有键的过期时间,这个字典称为过期字典

typedef struct redisDb{

......

dict *dict;

dict *expires;

......

}redisDb;

下图为带有过期字典的数据库示例:

29d470abd8f361a545ff83afc6a20407.png

新增/删除键的过期时间都表现为对过期字典的删除和添加节点操作。

如果一个键过期了,那什么时候被删除呢?

这里有三种策略:

定时删除:在设置键的过期时间的同时,创建一个定时器( timer ). 让定时器在键的过期时间来临时,立即执行对键的删除操作。

缺点:资源太多CPU时间

惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。

缺点:浪费内存,有内存泄漏的危险

定期删除: 每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库, 则由算法决定。

Redis采用惰性删除和定期删除两种策略结合,在执行所有读写数据库的命令前做如下判断:

d51e3639c0a776833628b48290a4c115.png

并且,周期地执行定时删除函数,工作流程为:

413e24946ed70bbb48e37bddd65f20dd.png

Redis过期键的删除策略相关教程

【leetcode】每日精选题详解之26. 删除排序数组中的重复项(经典

【leetcode】每日精选题详解之26. 删除排序数组中的重复项(经典题) 嗨,大家好,我是袁小厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家

什么?Redis的List类型不会用,看我这个小白教程包你满意

什么?Redis的List类型不会用,看我这个小白教程包你满意 j3_liuliang Redis常用API即应用场景系列(List),如果觉得有用可以关注博主,不定时更新哦! 一、列表(List) list命令需要知道的是它大致分两个类别 L(left) 和 R(right) ,顾名思义就是针对lis

Redis——基于Spring的开发示例(连接、序列化、high/low api)

Redis——基于Spring的开发示例(连接、序列化、high/low api) 文章目录 一、基本开发 1、建立spring boot项目 2、与vm中的redis建立连接 3、测试连接 二、high/low API及序列化 1、high level api RedisTemplate StringRedisTemplate 2、low level api 3、

从零开始手写 redis(七)LRU 缓存淘汰策略详解

从零开始手写 redis(七)LRU 缓存淘汰策略详解 前言 java从零手写实现redis(一)如何实现固定大小的缓存? java从零手写实现redis(三)redis expire 过期原理 java从零手写实现redis(三)内存数据如何重启不丢失? java从零手写实现redis(四)添加监听器

windos 启动redis服务端与客户端

windos 启动redis服务端与客户端 服务端: 1-win+R 打开命令行 2-cd至redis目录,例如 G:\Redis6381 3-输入 redis-server.exe redis.windows.conf 观察是否如图1:至此,已成功;否则,继续进行如下操作: 4-若启动redis出现 [****] *****(当前日期)****** #

Springboot2.0下通过redis实现支持分布式的mybatis二级缓存

Springboot2.0下通过redis实现支持分布式的mybatis二级缓存 最近领导要求在项目中加下mybatis二级缓存,由于当前项目是分布式微服务,且是多节点部署的,而司内缓存中间件使用的redis,那很自然的要用redis做分布式缓存支持,避免出现直接使用原生mybatis二级

Azure Blob Storage学习笔记——图片的上传浏览下载删除

Azure Blob Storage学习笔记——图片的上传,浏览,下载,删除 1.通过NuGet将Azure Storage的相关包引入项目 2.在config文件中写入相关帐号 add key= aspnet:UseTaskFriendlySynchronizationContext value= true / !--存储账号名称-- add key= AccountName v

redis持久化

redis持久化 redis是一个内存数据库,当redis服务器重后, 获取电脑重启,数据会丢失,我们可以将redi s内存中的数据持久化保存到硬盘的文件中。 1、redis持久化机制: RDB :默认方式,不需要进行配置,默认就使用这种机制,在一定的间隔时间中,检测key的变化情

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值