Redis 过期时间解析
文章参考:《Redis 设计与实现》黄建宏
设置过期时间
通过 EXPIRE 或者 PEXPIRE 命令,客户端可以以秒或毫秒精度为数据库中的某个键设置生存时间 TTL (Time To Live)
SETEX 命令可以设置一个字符串的同时为键设置过期时间
保存过期时间
redisDb 结构的 expires 字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:
- 过期字典的键是一个指针,这个指针指向键空间中的某个键对象
- 过期字典的值十亿额 long long 类型的整数,保存了键的过期时间, 一个毫秒精度的 UNIX 时间戳
typedef struct redisDb{
// ...
// 过期字典
dict *expires;
// ...
} redisDb;

过期键的判定
通过过期字典,可以用以下步骤检查一个给定键是否过期:
- 检查给定键是否存在于过期字典中,如果存在,那么取得键的过期时间
- 检查当前 UNIX 时间戳是否大于该键的过期时间,如果是的话, 那么键已经过期
过期键的删除策略
- 定时删除:在设置键的过期时间同时,创建一个定时器 timer,让定时器在键的过期时间来临时,立即执行对键的删除操作, 对内存最友好,占用大量 CPU,所以现阶段不现实
- 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期就删除该键,如果没有过期,就返回该键,对 CPU 友好,对内存不友好
在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那他们也许永远也不会被删除,除非手动执行 FLUSHDB, 我们甚至可以将这种情况看作是一种内存泄漏,这对于运行状态非常依赖内存的 Redis 服务器来说,肯定不是一个好消息。
- 定期删除:每隔一段时间,程序就对数据库进行一次检查, 删除里面的过期键
其中, Redis 使用了惰性删除和定期删除两种策略
Redis 过期时间解析的更多相关文章
- redis学习(五) redis过期时间
redis过期时间 1.redis过期时间介绍 有时候我们并不希望redis的key一直存在.例如缓存,验证码等数据,我们希望它们能在一定时间内自动的被销毁.redis提供了一些命令,能够让我们对ke ...
- Redis 过期时间
http://www.redis.cn/commands/expire.html 附录: Redis 过期时间 Keys的过期时间 通常Redis keys创建时没有设置相关过期时间.他们会一直存在, ...
- Redis过期时间
上次开发用了redis后效果不错,后来在进阶的开发中查询到,如果redis一直不释放也会占用内存,于是就想着给redis加上个过期时间. 具体操作很简单,只要在设置redis的时候加上exp就可以了, ...
- redis 过期时间与缓存
设置过期时间 redis对于存储的键值可以设置过期时间,对于过期了的键值,redis会自动删除. > OK > get price " > expire price (in ...
- python设置redis过期时间
import time import redis if __name__ == "__main__": try: conn=redis.StrictRedis(host='192. ...
- Redis -- 过期时间 和 缓存 例子
1.设置 key的生存时间,过期自动删除 exprire key seconds 设置过期时间 秒数 ttl key 查询剩余时间 如果 设置了过期时间.对key进行 set 操作,会清除 ...
- redis过期时间设置
方法一: $redis->setex(,'huahua'); 方法二: $redis->set('name','huahua'); $redis->expire('name',3);
- php操作redis和memcache过期时间
php-redis 设置过期时间setTimeOut 命令行expireredis过期时间redis术语里面,把设置了expire time的key 叫做:volatile keys. 意思就是不稳定 ...
- Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析
Springboot鼓励零配置的方式,帮你做好大部分重复劳动的事,好到不能再好:具体的Redis安装方法和Springboot集成Redis方法,可以去搜索相关文章或参考该文章http://www.c ...
随机推荐
- 马哥Linux--elasticsearch
ELK stack: Lucene: 文档:document 包含了一个或多个域的容器 field:value 域: 有很多选项 索引选项,存储选项,域向量使用选项 索引选项用于通过倒排索引来控制文本 ...
- Zabbix agent端 配置
Zabbix agent端 配置 agent端环境 zabbix-client:RHEL8 IP:192.168.121.11 一.安装 Zabbix 源 [root@zabbix-client ~] ...
- mysql3_pymysql
python数据库编程 1.pyshon数据库接口(python DB-API) 1.为开发人员提供的数据库应用编程接口 2.python支持的数据库服务软件 mysql,oracle,sql_ser ...
- SPI总线 通俗易懂讲解——(转载)
SPI总线 MOTOROLA公司的SPI总线的基本信号线为3根传输线,即SI.SO.SCK.传输的速率由时钟信号SCK决定,SI为数据输入.SO为数据输出.采用SPI总线的系统如图8-27所示,它包含 ...
- Linux 系统日志和系统信息常用命令介绍
日志文件 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日志信息 / ...
- 大对象数据LOB的应用(Day_10)
当你有永不放弃的精神,全力以赴的态度,你会惊叹自己也能创造奇迹! LOB数据类型概述 由于于无结构的数据往往都是大型的,存储量非常大,而LOB(large object)类型主要用来支持无结构的大型数 ...
- Canvas跟随鼠标炫彩小球
跟随鼠标炫彩小球 canvas没有让我失望,真的很有意思 实现效果 超级炫酷 实现原理 创建小球 给小球添加随机颜色,随机半径 鼠标移动通过实例化,新增小球 通过调用给原型新增的方法,来实现小球的动画 ...
- 对狂神说java的springboot中spring security的总结
1.spring security的环境搭建 首先新建一个springboot项目,只够选web中的spring web依赖 然后在pom.xml导入相关依赖 <!--thymeleaf模块-- ...
- Python神经网络集成技术Guide指南
Python神经网络集成技术Guide指南 本指南将介绍如何加载一个神经网络集成系统并从Python运行推断. 提示 所有框架的神经网络集成系统运行时接口都是相同的,因此本指南适用于所有受支持框架(包 ...
- TorchScript神经网络集成技术
TorchScript神经网络集成技术 create_torchscript_neuropod 将TorchScript模型打包为neuropod包. create_torchscript_neuro ...