Redis过期键的删除策略
Redis过期键的删除策略
Redis服务器中的每个数据库都由redisDb表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,这个字典就成为键空间:
typedef struct redisDb{
......
dict *dict;
......
}redisDb;
下图是一个数据库键空间的示例图:
《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;
下图为带有过期字典的数据库示例:
新增/删除键的过期时间都表现为对过期字典的删除和添加节点操作。
如果一个键过期了,那什么时候被删除呢?
这里有三种策略:
定时删除:在设置键的过期时间的同时,创建一个定时器( timer ). 让定时器在键的过期时间来临时,立即执行对键的删除操作。
缺点:资源太多CPU时间
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
缺点:浪费内存,有内存泄漏的危险
定期删除: 每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库, 则由算法决定。
Redis采用惰性删除和定期删除两种策略结合,在执行所有读写数据库的命令前做如下判断:
并且,周期地执行定时删除函数,工作流程为:
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的变化情