复述的过期机制

  

本文对复述的过期机制简单的讲解一下

讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到复述,作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存会话,又或者只存放日行情股票数据)那么就会出现一下几个问题了

复述,会自己回收清理不用的数据吗?

如果能,那如何配置?

如果不能,如何防止数据累加后大量占用存储空间的问题?

之前一直接触复述,不是很深入,最近项目当中遇到一个需求场景,需要清空一些存放在复述的数据,主要是通过一些时间进行过滤,删除那些不满足的数据,但是这样的工作每天都需要进行,那工作量就比较大了,而且每天都需要按时去手动清理,这样做也不切实际,后面发现复述中有个设置时间过期的功能,即对存储在复述,数据库中的值可以设置一个过期时间。

作为一个缓存数据库,这是非常实用的。这就是我们本文要讲到的复述过期机制。其实这个机制运用的场景十分广泛,比如我们一般项目中的令牌或者一些登录信息,尤其是短信验证码都是有时间限制的,或者是限制请求次数,如果按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。

<强>一、设置过期时间

复述,对存储值的过期处理实际上是针对该值的键(关键)处理的,即时间的设置也是设置关键的有效时间.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种过期策略

<强>定时删除

复述的过期机制