Redis如何设置键的生存时间或过期时间

键的生存时间或过期时间

概述。

通过EXPIRE命令或者PEXIPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL),在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键:

127.0.0.1:6379> SET key value
OK
127.0.0.1:6379> EXPIRE key 5
(integer) 1
// 5秒之内
127.0.0.1:6379> GET key
"value"
// 5秒之后
127.0.0.1:6379> GET key
(nil)

注意:

SETEX命令可以在设置一个字符串键的同时为键设置过期时间,因为这个命令是一个类型限定的命令(只能用于字符串键)
与EXPIRE命令和PEXPIRE命令类似,客户端可以通过EXPIREAT命令或PEXPIREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间(expire time)过期时间是一个UNIX时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键

127.0.0.1:6379> SET key value
OK
127.0.0.1:6379> EXPIREAT key 1710944249
(integer) 1
// 过期时间之前
127.0.0.1:6379> GET key
"value"
// 过期时间之后
127.0.0.1:6379> GET key
(nil)

TTL和PTTL

TTL命令和PTTL命令接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间,也就是,返回距离这个键被服务器自动删除还有多长时间

127.0.0.1:6379> SET key value
OK
127.0.0.1:6379> EXPIRE key 1000
(integer) 1
127.0.0.1:6379> TTL key
(integer) 996

设置过期时间。

Redis有四个不同的命令可以用于设置键key的生存时间(键可以存在多久)或过期时间(键什么时候会被删除)

  • 1.EXPIRE 命令用于将键key的生存时间设置为ttl秒
  • 2.PEXPIRE命令用于将键key的生存时间设置为ttl毫秒
  • 3.EXPIREAT 命令用于将键key的过期时间设置为timestamp所指定的秒数时间戳
  • 4.PEXIREAT命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳
    虽然有多种不同单位和不同形式的设置命令,但实际上EXPIRE、PEXIPIRE、EXPIREAT三个命令都是使用PEXIPREAT命令来实现的:无论客户端执行的是以上四个命令中的哪一个,经过转换之后,最终的执行效果都和执行PEXIPIREAT命令一样

内部实现

首先,EXPIRE命令可以转换成PEXIPIRE命令

def EXPIRE(key, ttl_in_sec):
#将TTL从秒转换成毫秒
ttl_in_ms = sec_to_ms(ttl_in_ec)

接着,PEXIRE命令又可以转换成PEXIREAT命令:

def PEXIPRE(key, ttl_in_ms):
# 获取以毫秒计算的当前UNIX时间戳
now_ms = get_curent_unix_timestamp_in_ms();
# 当前时间加上TTL,得出毫秒格式的键过期时间
PEXIREAT(key,now_ms+ttl_in_ms)

并且,EXPIREAT命令也可以转换成PEXIREAT命令:

def EXPIREAT (key, expire_time_in_sec):
# 将过期时间从秒转换为毫秒
expire_time_in_ms = sec_to_ms(expire_time_in_sec)
PEXPIREAT(key, expire_tiime_in_ms);

最终,EXPIRE、PEXPIRE和EXPIREAT三个命令都会转化成PEXIREAT命令来执行

在这里插入图片描述

保存过期时间

redisDb结构的expire字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:

  • 1.过期字典的键是一个指针,这个指针指向键是一个指针,这个指针指向键空间的某个键对象(也即是某个数据库键)
  • 2.过期字典的值是一个long long类型的整数。这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的UNIX时间戳。
typedef struct redisDb {// ..// 过期字典,保存着键的过期时间dict *expire;// ...
}redisDb;

例子

在这里插入图片描述

  • 举个例子,图中的过期字典保存了两个键值对:
    1.第一个键值对的键为alphabet键对象,值为1385877900000,这表示数据库键alphabet的过期时间为1385877600000(2013年12月)
    2.第二个键值对的键为book键对象,值为1388556000000,这表示数据库键book的过期时间为1388556000000(2014年1月1日零时)当客户端执行PEXPIREAT命令(或者其他三个会转换成PEXIPREAT命令的命令)为一个
    数据库键设置过期时间时,服务器会在数据库的过期字典中关联给定的数据库和过期时间

读写键空间时的维护操作

当使用Redis命令对数据库进行读写时,服务器不仅会对键空间执行指定的读写操作还会执行一些额外的维护操作,其中包括

  • 在读取一个键之后(读操作和写操作都要对键进行读取),服务器会根据键是否存在来更新服务器的键空间命中(hit)次数或键空间不命中(miss)次数,这两个值可以在INFO stats命令的keyspace_hits属性和keyspace_misses属性中查看
127.0.0.1:6379> info stats
# Stats
total_connections_received:15
total_commands_processed:1887
instantaneous_ops_per_sec:0
total_net_input_bytes:9624
total_net_output_bytes:2803
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:3
evicted_keys:0
keyspace_hits:38
keyspace_misses:11
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:9925
migrate_cached_sockets:0
127.0.0.1:6379>
  • 在读取一个键之后,服务器会更新键的LRU(最后一次使用)时间,这个值可以用于计算键的闲置时间,使用OBJECT idle time key命令可以查看键的闲置时间。
127.0.0.1:6379> set k v
OK
127.0.0.1:6379> OBJECT idletime k
(integer) 6
  • 如果服务器在读取一个键时发现该键已经过期,那么服务器会先删除这个过期键然后才执行余下的操作
  • 如果又客户端使用WATCH命令监视了某个键,那么服务器在对被监视的键进行修改之后,会将这个键标记为脏(dirty),从而让事务程序注意到这个键已经被修改过
  • 服务器每次修改一个键之后,都会对脏(dirty)键计数器的值增1,这个计数器会触发服务器的持久化以及复制操作
  • 如果服务器开启了数据库通知功能,那么在对键进行修改之后,服务器将按配置发送相应的数据库通知

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

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

相关文章

策略模式实战

项目推荐最近开发完成的项目中使用到了策略模式,实现多种支付方式,避免了后期支付方式if-else代码的冗余,也有利于后期支付的一个扩展。同时这个项目非常适合于做毕设,想了解这个项目的同学可以联系我QQ:3808898981 前…

Python学习:注释和运算符

python 注释 在Python中,注释用于在代码中添加解释、说明或者提醒,但并不会被解释器执行。Python中的注释以#开头,直到行末为止。下面是关于Python注释的详细解释和举例: 单行注释:使用#符号在行的开头添加注释&…

【MySQL】图形化界面工具DataGrip安装&配置&使用

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

NVIDIA Chat with RTX教程使用以及CUDA和CUDNN

基本环境安装:CUDA12.1CUDNNcudnn-windows-x86_64-8.9.7.29_cuda12-archive 1、CUDA下载 CUDA官方安装教程: https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html CUDA Toolkit的下载: CUDA Toolkit 12.1 Downloads | NVIDIA Dev…

vue3封装对话框el-dialog组件

实现逻辑: 1、引入对话框组件; 2、对话框组件中定义一个方法,通过defineExpose({})暴漏出去; 3、组件使用,并用ref绑定; 4、点新增和编辑的时候,通过ref调用对话框暴漏出来的方法,并…

【数据可视化】Echarts中的其它图表

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 绘制散点图2.1 绘制基本散点图2.2 绘制两个序列的散点图2.3 绘制带涟漪特效的散点图 3. 绘制气泡图3.1 绘制标准气泡图3.2 绘制各国人均寿命与GDP气泡图3.3 绘制城市A、城市B、城市C三个城市空气污染指数气…

塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型

塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型。塑料制造行业作为重要的工业领域,亟需借助这一平台实现产业升级与转型,以适应市场的变化和提高生产效率。传统的塑料制造过程往往存在生产效率低下、资源浪费、环境污染等问题…

突发!OpenAI服务异常!!!

2024/3/20傍晚7点,笔者的朋友在使用OpenAI时,页面提示服务异常,由此引发了我的深思:人工智能的脆弱性与未来的挑战 2024年3月20日,傍晚7点,一个普通的周二,我的朋友在尝试使用OpenAI时&#xf…

方案开发行业迎来新数字化转型新浪潮

着科技的不断发展和市场需求的日益增长,方案开发行业正迎来新一轮的创新浪潮。数字化转型已成为该行业的关键词,各大企业纷纷加大研发投入,以期在激烈的市场竞争中脱颖而出。 近年来,方案开发行业在范围内取得了显著的发展。根据…

从初学者到专家:Java枚举的完整指南

1.枚举的概念 在Java中,枚举是一种特殊的数据类型,用于定义一组有限的命名常量。枚举提供了一种更直观、更可读的方式来表示一组相关的常量,并且可以为这些常量绑定其他数据或行为。 背景:枚举是在JDK1.5以后引入的。 主要用途…

【JavaScript】JavaScript 程序流程控制 ② ( 循环流程控制 | 循环要素 - 循环体 / 循环终止条件 | for 循环语法结构 )

文章目录 一、JavaScript 程序流程控制 - 循环流程控制1、循环流程控制2、循环要素 - 循环体 / 循环终止条件3、for 循环语法结构 - 循环控制变量 / 循环终止条件 / 操作表达式4、for 循环 完整代码示例 一、JavaScript 程序流程控制 - 循环流程控制 1、循环流程控制 在 程序开…

杰发科技AC7801——Keil编译的Hex大小如何计算

编译结果是Keil里面前三个数据的总和: 即CodeRoDataRWData的总和。 通过ATCLinkTool工具查看内存,发现最后一个字节正好是5328 注意读内存数据时候需要强转成32位,加1000的 增加1024的地址只需要加256即可

关于paper中的一些硬件知识

一. OS中的event Information in event traces from software systems can help developers with performance analysis, debugging and troubleshooting 1.事件的概念 已知软件系统中的event能够帮助开发者对系统进行性能分析、调试以及定位,那我们应该仔细考虑…

突破图神经网络技术瓶颈!新阶段3大创新方向大幅提高模型性能

针对传统的图神经网络在处理非结构化数据、捕捉高阶关系等方面的局限性,研究者们提出了众多优化方案。 这其中,超图神经网络、几何图神经网络、动态图神经网络作为GNN发展的前沿方向,不仅提供了更加丰富和灵活的方法来处理各种复杂的图数据&…

【Linux】Linux安装软件---软件包管理器 yum

主页:醋溜马桶圈-CSDN博客 专栏:Linux_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.Linux中安装软件 1.1 源代码安装 1.2 rpm包安装 1.3 yum安装 1.3.1 举例 1.3.2 图示yum下载安装 2.Linux系统的生态 如何选…

第9关:请将(S2,J6,P4,200)插入供应情况关系表SPJ

任务描述 请将(S2,J6,P4,200)插入供应情况关系表SPJ 相关知识 供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图&…

单片机--数电(2)

组合逻辑电路 根基题目要求设计逻辑电路 组合逻辑电路 由一些逻辑门电路搭建,为实现某些功能的电路 特点 在任意时刻输出只取决于该时刻的输入,与电路原来的状态无关 根据图分析组合逻辑的方法 可以使用multisim的逻辑转换仪 1组合逻辑电路图 2…

CCIE-06-EIGRP_TS

目录 实验条件网络拓朴 路由器基础配置开始排错, 要求R14访问R11的lo0时负载均衡1. K值不匹配2. R14和R13邻居关系没有起来,3. 继续排查邻居关系,R13和R11关系没有起来4. R13的R11邻居关系起来又关闭,关闭又起来(认证信…

【Qt学习笔记】(三)--编写上位机软件(ui设置、样式表serialport串口接收数据、Qchart显示波形)

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    这段时间大部分都是在学Qt,前面想着跟着书一章章的学,但是发现这个效率极低,所以就改变了学习的方法,那…

蓝桥杯java组 螺旋折线

题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)3, dis(-2, -1)9 给出整点坐标(X, Y),你能计算出dis(X, Y)吗? 【输入格…