redis设置键的生存时间或过期时间

PX4开发环境搭建(Ubuntu1804+QGC+Qt Creator ) 文章目录前言一、安装环境二、PX4环境搭建1. 在虚拟机中安装Ubuntu2. 安装PX4环境(1)下载PX4源码:(2) 安装工具链(3) jMAVSim仿真(4) 编译验证三、安装QGC四、安装Qt Creator 前言 在这之前作者完全没接触过PX4,安装过程遇到了很多坑,而且每安装下载一个东西都要等好久,出现问题又要重新开始,前后折腾了四天才弄好,希望此文对大家有所帮助。 一、安装环境 ... 阅读详情

设置键的生存时间或过期时间

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

复制代码

redis> SET key value
OK
redis> EXP 工RE key 5
(integer) 1
redis> GET key // 5 秒之内
"value"
redis> GET key // 5 秒之后
(nil)

复制代码

注意
SETEX 命令可以在设直一个字符串键的同时为键设直过期时间,因为这个命令是一个类型限定的命令(只能用于字符串键),但SETEX 命令设置过期时间的原理和EXPIRE命令设置过期时间的原理是完全一样的。

与EXPlRE 命令和PEXPIRE 命令类似,客户端可以通过EXPlREAT 命令或PEXPlREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间(expire time)。
过期时间是一个UNIX时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键:

 

复制代码

redis> SET key value
OK
redis> EXPIREAT key 1377257300
(integer) 1
redis> TIME

1)"1377257296"
2)"296543"
redis> GET key // 1377257300 之前
"value"
redis> TIME
1)"1377257303"
2)"230656 "
redis> GET key // 1377257300 之后
(nil)

复制代码

 

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

复制代码

redis> SET key va1ue
OK
redis> EXPlRE key 1000
(integer) 1
redis> TTL key
(integer) 997
redis> SET another_key another_value
OK
redis> TIME
1) "1377333070 "
2)  "761687 "
redis> EXPlREAT another key 1377333100
(integer ) 1
redis> TTL another key
(integer) 10

复制代码

设置过期时间

 

Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) :
EXPlRE <key> <ttl> 命令用于将键key 的生存时间设置为ttl 秒。
PEXPIRE <key> <ttl> 命令用于将键key 的生存时间设置为ttl 毫秒。
EXPIREAT <key> < timestamp> 命令用于将键key 的过期时间设置为timestamp所指定的秒数时间戳。
PEXPIREAT <key> < timestamp > 命令用于将键key 的过期时间设置为timestamp所指定的毫秒数时间戳。

虽然有多种不同单位和不同形式的设置命令,但实际上EXPlRE、PEXPlRE 、EXPIREAT三个命令都是使用PEXPlREAT 命令来实现的:无论客户端执行的是以上四个命令中的哪一个, 经过转换之后,最终的执行效果都和执行PEXPlREAT 命令一样。
首先, EXPIRE 命令可以转换成PEXPlRE 命令:

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

接着,PEXPlRE 命令又可以转换成PEXPlREAT 命令:

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

并且,EXPlREAT命令也可以转换成PEXPlREAT命令:

def EXPIREAT (key,expire_time_in_ sec):
#将过期时间从秒转换为毫秒
expire_time_ in_ms = sec_to_ms (expire_time_in_sec)
PEXPlREAT(key, expire_time_in_ms)

 

保存过期时间

redisDB结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:
过期字典的键是一个指针,这个指针指向键空间中的某个键对象( 也即是某个数据库键)。
过期字典的值是一个long long 类型的整数,这个整数保存了键所指向的数据库键的过期时间:一个毫秒精度的UNIX 时间戳。

复制代码

typedef struct redisDb {
//...
// 过期字典,保存着键的过期时间

dict *expires ;
//...
} redisDb;

复制代码

如下图展示了一个带有过期字典的数据库例子,在这个例子中,键空间保存了数据库中的所有键值对,而过期字典则保存了数据库键的过期时间。

过期字典将新增一个键值对, 其中键为message 键对象,而值则为1391234400000(2014年2月1日零时) ,如图9-13 所示。

图9-12 中的过期字典保存了两个键值对:
第一个键值对的键为alphabet 键对象,值为1385877600000 ,这表示数据库键alphabet 的过期时间为1385877600000 (2013年12月1日零时)。
第二个键值对的键为book键对象,值为1388556000000,这表示数据库键book的过期时间为1388556000000(2014年1月1日零时)。
当客户端执行PEXPIREAT 命令(或者其他三个会转换成PEXPIREAT命令的命令)为一个数据库键设置过期时间时,服务器会在数据库的过期字典中关联给定的数据库键和过期时间。
举个例子, 如果数据库当前的状态如图9-12 所示, 那么在服务器执行以下命令之后:

redis> PEXPIREAT message 1 391234400000
(integer) 1

过期字典将新增一个键值对,其中键为message键对象,而值则为1391234400000(2014年2月1日零时),如图9-13 所示。

 以下是PEXPlREAT 命令的伪代码定义:

复制代码

def PEXPIREAT(key,expire_time_in_ms) :
#如果给定的键不存在于键空间,那么不能设置过期时间
if key not in redisDB.dict :
return 0
#在过期字典中关联键和过期时间
redisDB.expires[key]=expire_tirne_in_ms
#过期时间设置成功
return 1

复制代码

移除过期时间

PERSIST命令可以移除一个键的过期时间:

复制代码

redis>PEXPlREAT message 1391234400000
(integer) 1
redis>TTL message
(integer) 13893281
redis> PERSIST message
(integer) 1
redis> TTL message
(integer) - 1

复制代码

PERSIST命令就是PEXPIREAT命令的反操作: PERSIST 命令在过期字典中查找给定的键,并解除键和值(过期时间)在过期字典中的关联。
举个例子,如果数据库当前的状态如图9-12所示,那么当服务器执行以下命令之后:

redis> PERSIST book
(integer) 1

数据库将更新成图9-14 所示的状态。

可以看到,当PERSIST命令执行之后,过期字典中原来的book键值对消失了,这代表数据库键book的过期时间已经被移除。
以下是PERSIST 命令的伪代码定义:

复制代码

def PERSIST(key) :
#如果键不存在,或者键没有设置过期时间,那么直接返回
if key not in redisDB.expires:
return 0
#移除过期字典中给定键的键值对关联
redisDB.expires.remove(key)
#键的过期时间移除成功
return 1

复制代码

计算并返回剩余生存时间

TTL 命令以秒为单位返回键的剩余生存时间, 而P TTL 命令则以毫秒为单位返回键的剩余生存时间:

redis> PEXPIREAT alphabet 1385877600000
(integer) 1
redis> TTL alphabet
(integer) 85 49007
redis> PTTL alphabet
(integer) 8549001011

TTL 和PTTL 两个命令都是通过计算键的过期时间和当前时间之间的差来实现的,以下
是这两个命令的伪代码实现:

复制代码

def PTTL (key) :
#键不存在于数据库
if key not in redisDb.dict:
return -2
#尝试取得键的过期时间
#如果键没有设置过期时间,那么expire_time_in_ms将为None
expire_time_in_ms = redisDB.expires.get(key)
#键没有设置过期时间
if expire time in ms is None:
return -1
#获得当前时间
now_ms = get_current_unix _timestamp_in_ms ()
#过期时间减去当前时间, 得出的差就是键的剩余生存时间
return(expire_time_in_ms - now_ms)
def TTL(key):
#获取以毫秒为单位的剩余生存时间
ttl_in_ms = PTTL (key )
if ttl_in_ms < 0:
#处理返回值为2 和斗的情况
return ttl_in_ms
else:
#将毫秒转换为秒
return ms_to_sec(ttl_in_ms)

复制代码

举个例子,对于一个过期时间为1385877600000(2013年12月1日零时)的键alphabet来说:
如果当前时间为1383282000000 (2013年11月1日零时),那么对键alphabet执行PTTL命令将返回2595600000 ,这个值是通过用a1phabet 键的过期时间减去当前时间计算得出的: 1385877600000-1383282000000=25956000000
另一方面,如果当前时间为1383282000000 ( 2013年11月1日零时),那么对键alphabet执行TTL命令将返回2595600,这个值是通过计算alphabet 键的过期时间减去当前时间的差,然后将差值从毫秒转换为秒之后得出的。

过期键的判定

通过过期字典,程序可以用以下步骤检查一个给定键是否过期:
1 )检查给定键是否存在于过期字典:如果存在,那么取得键的过期时间。
2 )检查当前UNIX 时间戳是否大于键的过期时间: 如果是的话,那么键已经过期;否则的话,键未过期。
可以用伪代码来描述这一过程:

复制代码

def is expired(key) :
#取得键的过期时间
expire_time_in_ms = redisDB.expires.get(key)
#键没有设置过期时间
if expire_time_in_ms is none:
    return false
#取得当前时间的UNIX 时间戳
now_ms = get_current_unix_timestamp_in_ms()
#检查当前时间是否大于键的过期时间
if now_ms > expire time_in_ms :
#是,键已经过期
return true
else :
# 否,键未过期
return false

复制代码

举个例子,对于一个过期时间为1385877600000 (2013年12月1日零时)的键alphabet来说:

如果当前时间为1383282000000 (2013 年II 月1 日零时),那么调用is_expired ( alphabet ) 将返回False ,因为当前时间小于alphabet 键的过期时间。
另一方面,如果当前时间为1385964000000 (2013年12月2日零时),那么调用is_expired(alphabet) 将返回True. 因为当前时间大于alphabet 键的过期时间。

注意
实现过期键判定的另一种方法是使用TTL 命令或者PTTL 命令,比如说,如采对某个键执行TTL 命令,并且命令返回的位大于等于0 ,那么说明该键未过期。在实际中, Redis检查键是否过期的方法和is_expired函数所描述的方法一致,因为直接访问字典比执行一个命令稍微快一些。

使用安卓的IMU数据进行 行人航位推算(PDR)推算步长 附python 代码 加速度计数据、陀螺仪数据、重力传感器数据、姿态仰角数据。数据分析与定位轨迹生成主要使用Python离线完成。示意图。 阅读详情

相关推荐

Aras Innovator系统配置-01对象类(一)

对象类配置-对象类属性说明

企业信息化(PLM,ERP.MES) 2031

Redis使用详解

Redis使用详解

KKK 2302

STM32 ST-LINK Utility 无法烧录程序的解决方法

当你打开STM32 ST-LINK Utility,硬件连接好st-link V2,打开了要烧写的文件,点那个Program verify烧录时, 如果出错了: Programming error @ 0x08000000! 我的方法是: 点你想要烧录那个HEX文件的小格,复制 然后去到你前面的文件的格子里,点粘贴: 成功! ...

wocute的博客 9521

Redis详解

1、与mencache比较 性能方面:没有必要过多的关心性能,因为二者的性能都已经足够高了。由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还...

黄规速博客:学如逆水行舟,不进则退 1万+

scratch航天梦主题课程作品分享,包含ppt、素材包

而今年多国都将发射探测器尝试登陆月球,2023年或将称为“登月年”,请大家发挥创新思维,以“星辰大海”为创作主题,搜集相关信息 、展开联想,为实现升空 、探测 、取样贡献创意!即使去淘宝买的素材,也要从百度网盘,但素材太多大了或者太多文件,也要充值百度网盘超级会员才能保存,提高下载速度。同学们大家好,今天我们就要开始航天主题-嫦娥五号探月工程系列的编程课程了,不仅可以学习到很多航天知识,了解本次嫦娥五号的发射历程,还能让我们用编程遨游太空呢。即使下载了,也要上传,不是特别方便,尤其是不好查找。

少儿编程吕口口 2481

DAZ STUDIO 快速渲染技巧

DAZ STUDIO 快速渲染技巧: 本文将向您展示几个快速渲染技巧。您将学习如何使您的Daz Iray渲染和照明在Daz工作室内更快。 当你有一个大场景,这可能需要很多小时进行渲染。 但是如果你想大幅度降低渲染时间呢?这篇文章的提示应该能让你达到这个目标。 首先,我们需要弄清楚一件事——没有“完美的环境或设置”这样的东西。是因为渲染设置是高度个性化和主观性的东西,这主要取决于场景和硬件。如果你有一个功能强大的计算机,你可以允许更多的低渲染时间,反之亦然。因此,一切都取决于您尝试渲染的对象和机器。

DAZSTUDIO的博客 9644

Redis中的TTL

Redis的ttl是在实战中的一个常用的命令,在学redis的过程中单纯的用过,没有更加深入的了解。下面附上Redis的官方文档: TTL key 起始版本:1.0.0 时间复杂度:O(1) 返回key剩余的过期时间。 这种反射能力允许Redis客户端检查指定key在数据集里面剩余的有效期。 在Redis 2.6和之前版本,如果key不存在或者已过期时返回-1。 从Redis2.8开始,错误返回值的结果有如下改变: 如果key不存在或者已过期,返回 -2 如果key存在并且没有设置过期时间(永久有

嘻嘻嘻 1万+

4. PCIe 接口时序

在上一篇中,大致介绍IPcore接口。总的来说接口如下图数据的接收和发送通过transmitTLPinterface和ReceiveTLPinterface。收发数据的时序也只是描述这几个接口的关系。从手册上截取PCIex1的接口时序。

jjinl的专栏 6119

【Redis】Redis常用命令-get&set&keys&exists&expire&ttl&type&

【Redis】Redis常用命令

chuxinchangcun的博客 1458

Gromacs 模拟昆虫 P450 解毒酶与农药结合完整指南,仅供参考!

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1238

什么是 PD 电压诱骗?

电压诱骗” 的意思就是,使用某些方法让 PD 充电器误以为设备需要更高的电压,从而让充电器提供比实际需要更高的电压。手机可能只需要 5V,但笔记本电脑可能需要 20V,通过 PD 协议,充电器能够根据设备的需求输出合适的电压和电流。在“电压诱骗”的情况下,你通过某种手段让充电器以为设备需要 12V,于是充电器会按照这个伪造的请求输出 12V,而不是默认的 5V。充电器评估自己的能力,如果可以提供设备需要的电压和电流,它会调整输出电压,从默认的 5V 切换到设备请求的电压(如 12V)。

qq_45430571的博客 2657

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

与EXPIRE命令和PEXPIRE命令类似,客户端可以通过EXPIREAT命令或PEXPIREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间(expire time)过期时间是一个UNIX时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键。TTL命令和PTTL命令接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间,也就是,返回距离这个键被服务器自动删除还有多长时间。Redis有四个不同的命令可以用于设置键key的生存时间(键可以存在多久)或过期时间(键什么时候会被删除)

Cover_sky的博客 1829

飞牛fnNAS存储模式RAID 5数据恢复

中介绍了fnNAS存储空间的几个模式,细心的网友应该能感受到,我是非常推崇RAID 5的。但我认为,一般人出现1块硬盘损坏后,就能够赶紧采取处理措施了,再高的容灾等级也无法满足这个用户的需求了。》就完成了飞牛NAS存储空间的说明,包括了如何创建、怎么选择空间模式、RAID 5 硬盘故障后的更换、系统更换/重装后数据盘的恢复等等。在VMware中新建虚拟机,安装好fnNAS后,再向虚拟机添加“已有硬盘”(这就是所谓崩溃虚拟机的数据盘),此时新的fnNAS出现提示。在“选择要添加的硬盘”中,选择刚添加硬盘。

dgnankai的专栏 3008

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

通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL),在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键。 与EXPIRE命令和PEXPIRE命令类似,客户端可以通过EXPIREAT(多了个AT)命令或PEXPIREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间。 过期时间是一个UNIX时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键。 虽然有多种不同单位和不同形式的设置命令.

zzd的博客 722

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

redis 查看key的有效期_redis key的过期时间

设置redis key的生存过期时间Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) :EXPlRE 命令用于将键key 的生存时间设置为ttl 秒。PEXPIRE 命令用于将键key 的生存时间设置为ttl 毫秒。EXPIREAT < timestamp> 命令用于将键key 的过期时间设置为timestamp所指定的秒数时间戳。...

weixin_40003233的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Redis 基础 -- 数据自动过期(EXPIRE、PEXPIRE、SET命令的EX选项和PX选项、EXPIREAT、PEXPIREAT、TTL PTTL:获取键的剩余生存时间)

EXPIRE命令和PEXPIRE命令可以为键设置生存时间,当键的生存时间随着时间的流逝而消耗殆尽时,键就会被移除。对已经带有生存时间的键执行EXPIRE命令或PEXPIRE命令,将导致键已有的生存时间被新的生存时间替代。为了方便用户,Redis给SET命令增加了EX和PX两个选项,它们可以让用户在执行SET命令的同时,执行EXPIRE命令或PEXPIRE命令。EXPIREAT命令和PEXPIREAT命令可以为键设置UNIX时间戳格式的过期时间,当系统时间超过这个过期时间时,键就会被移除

天行健 君子以自强不息,地势坤 君子以厚德载物。 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Redis的key的四种过期失效命令

Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) : EXPlRE <key> <ttl> 命令用于将键key 的生存时间设置为ttl 秒。 PEXPIRE <key> <ttl> 命令用于将键key 的生存时间设置为ttl 毫秒。 EXPIREAT <key> < timest...

玩火的稻草人的博客 2366

Redis生存时间--Redis系列八

1、设置生存时间 EXPIRE key seconds  其中seconds参数表示键的生存时间,单位是秒,到期后Redis会自动删除它。 PEXPIRE key Milliseconds  生存时间单位是毫秒 EXPIREAT PEXPIREAT 返回值1 设置生存时间成功,0表示键不存在或者设置失败。 2、查询剩余时间 TTL key 返回值为剩余生存时间, -1表示没有键或者

欲穷千里目,更上一层楼 5822

Redis数据库——键过期时间

我们可以在Redis客户端输入命令,可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在指定秒数或者毫秒数之后,服务器会自动删除生存时间为0的键。

weixin_57023347的博客 4579

Redis附加功能之键过期功能

一、键过期功能的相关命令 二、设置生存时间 Redis 提供了两个命令来设置键的生存时间(TTL,time to live),它们分别是: 如果给定的键不存在,那么 EXPIRE 和 PEXPIRE 将返回 0 ,表示设置失败;如果命令返回 1 ,那么表示设置成功。当一个键被设置了生存时间之后,它的生存时间将会随着时间的流逝而减少:时间过去一毫秒,键的生存时间就减少一毫秒;时间过去一...

weixin_30569001的博客 104

Redis对象自动过期

expire命令和pexpire命令可以为键设置生存时间,当键的生存时间随着时间的流逝而消逝殆尽时,键就会被移除;对已经带有生存时间的键执行expire命令或pexpire命令,将导致键已有的生存时间被新的生存时间替代;为了方便用户,Redis给set命令增加了ex和px选项,它们可以让用户在执行set命令的同时,执行expire命令或pexpire命令;expireat命令和pexpireat命令可以为键设置Unix时间戳格式的过期时间,当系统时间超过这个过期时间时,键就会被移除

蜗牛学习笔记 971

redis key存入mysql_Redis实现之数据库(二)

设置键的生存时间或过期时间通过EXPIRE或PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL),在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键:127.0.0.1:6379> SET key valueOK127.0.0.1:6379> EXPIRE key 5(integer) 1# 5秒之内127.0...

weixin_39615499的博客 304
上一篇: redis 延时任务 看一篇成高手系列 二
下一篇: github生成密钥
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值