本文对复述的过期机制简单的讲解一下
讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到复述,作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存会话,又或者只存放日行情股票数据)那么就会出现一下几个问题了
复述,会自己回收清理不用的数据吗?
如果能,那如何配置?
如果不能,如何防止数据累加后大量占用存储空间的问题?
之前一直接触复述,不是很深入,最近项目当中遇到一个需求场景,需要清空一些存放在复述的数据,主要是通过一些时间进行过滤,删除那些不满足的数据,但是这样的工作每天都需要进行,那工作量就比较大了,而且每天都需要按时去手动清理,这样做也不切实际,后面发现复述中有个设置时间过期的功能,即对存储在复述,数据库中的值可以设置一个过期时间。
作为一个缓存数据库,这是非常实用的。这就是我们本文要讲到的复述过期机制。其实这个机制运用的场景十分广泛,比如我们一般项目中的令牌或者一些登录信息,尤其是短信验证码都是有时间限制的,或者是限制请求次数,如果按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。
<强>一、设置过期时间强>
复述,对存储值的过期处理实际上是针对该值的键(关键)处理的,即时间的设置也是设置关键的有效时间.Expires字典保存了所有键的过期时间,到期也被称为过期字段。
键到期时间(以秒为单位)——这是最常用的方式
setex(字符串键,int秒,字符串值),字符串独有的方式
注:
1,除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠到期方法来设置时间
2,如果没有设置时间,那缓存就是永不过期
3,如果设置了过期时间,之后又想让缓存永不过期,使用坚持关键
1,常用方式
一般主要包括4种处理过期方,其中到期都是以秒为单位,pexpire都是以毫秒为单位的。
键秒//将键到期的生存时间设置为ttl秒 PEXPIRE关键毫秒//将关键的生成时间设置为ttl毫秒 EXPIREAT关键时间戳//将关键的过期时间设置为时间戳所代表的的秒数的时间戳 PEXPIREAT关键milliseconds-timestamp//将关键的过期时间设置为时间戳所代表的的毫秒数的时间戳
备注:时间戳为unix时间戳(例如:时间戳=1499788800表示将在2017.07.12过期)
1、2两种方式是设置一个过期的时间段,就是咱们处理验证码最常用的策略,设置三分钟或五分钟后失效,把分钟数转换成秒或毫秒存储到复述中。
3、4两种方式是指定一个过期的时间,比如优惠券的过期时间是某年某月某日,只是单位不一样。
下面我们就以EXPIREAT为例子简单讲解下用法。
返回值
一个整数值1或0,如下:
如果成功地为该键设置了超时时间,返回1
如果键不存在或无法设置超时时间,返回0
语法
以下是以复述的EXPIREAT命令的基本语法。
复述127.0.0.1:6379>Expireat KEY_NAME TIME_IN_UNIX_TIMESTAMP
示例
首先,在复述中创建一个键:阿奇,并在阿奇中设置一些值。
复述127.0.0.1:6379>复述,将阿奇 好
现在,为设置创建的键设置超时时间为60秒。
127.0.0.1:6379>复述,将阿奇 好吧 127.0.0.1:6379>EXPIREAT阿奇1393840000 (整数)1 127.0.0.1:6379>存在阿奇 (整数)0 127.0.0.1:6379>复述,将阿奇 好吧 127.0.0.1:6379>EXPIREAT阿奇1493840000 (整数)1 127.0.0.1:6379>存在阿奇 (整数)1
其他三个用法类似,这里不逐一阐述
2,字符串独有方式
对字符串特殊处理的方式为SETEX命令,SETEX命令为指定的关键设置值及其过期时间。如果关键已经存在,SETEX命令将会替换旧的值。
返回值
设置成功时返回好。
语法
复述SETEX命令基本语法如下:
复述127.0.0.1:6379>SETEX KEY_NAME超时值
示例
复述127.0.0.1:6379>SETEX mykey 60复述, 好吧 复述,127.0.0.1:6379>TTL mykey 60 复述,127.0.0.1:6379>得到mykey “复述,
<强>二,3种过期策略强>
<强>定时删除强>