本文对Redis的过时机制简单的讲解一下
讲解以前咱们先抛出一个问题,咱们知道不少时候服务器常常会用到redis做为缓存,有不少数据都是临时缓存一下,可能用过以后好久都不会再用到了(好比暂存session,又或者只存放日行情股票数据)那么就会出现一下几个问题了html
以前一直接触Redis不是很深刻,最近项目当中遇到一个需求场景,须要清空一些存放在Redis的数据,主要是经过一些时间进行过滤,删除那些不知足的数据,可是这样的工做天天都须要进行,那工做量就比较大了,并且天天都须要按时去手动清理,这样作也不切实际,后面发现Redis中有个设置时间过时的功能,即对存储在Redis数据库中的值能够设置一个过时时间。做为一个缓存数据库,这是很是实用的。这就是咱们本文要讲到的Redis过时机制。其实这个机制运用的场景十分普遍,好比咱们通常项目中的token或者一些登陆信息,尤为是短信验证码都是有时间限制的,或者是限制请求次数,若是按照传统的数据库处理方式,通常都是本身判断过时,这样无疑会严重影响项目性能。redis
Redis对存储值的过时处理其实是针对该值的键(key)处理的,即时间的设置也是设置key的有效时间。Expires字典保存了全部键的过时时间,Expires也被称为过时字段。数据库
注:
一、除了字符串本身独有设置过时时间的方法外,其余方法都须要依靠expire方法来设置时间
二、若是没有设置时间,那缓存就是永不过时
三、若是设置了过时时间,以后又想让缓存永不过时,使用persist key缓存
通常主要包括4种处理过时方,其中expire都是以秒为单位,pexpire都是以毫秒为单位的。服务器
1 EXPIRE key seconds //将key的生存时间设置为ttl秒
2 PEXPIRE key milliseconds //将key的生成时间设置为ttl毫秒
3 EXPIREAT key timestamp //将key的过时时间设置为timestamp所表明的的秒数的时间戳
4 PEXPIREAT key milliseconds-timestamp //将key的过时时间设置为timestamp所表明的的毫秒数的时间戳
备注:timestamp为unix时间戳(例如:timestamp=1499788800 表示将在2017.07.12过时)
一、2两种方式是设置一个过时的时间段,就是我们处理验证码最经常使用的策略,设置三分钟或五分钟后失效,把分钟数转换成秒或毫秒存储到Redis中。
三、4两种方式是指定一个过时的时间 ,好比优惠券的过时时间是某年某月某日,只是单位不同。session
下面咱们就以EXPIREAT为例子简单讲解下用法。memcached
返回值性能
一个整数值1或0,以下:学习
语法
如下是以Redis的EXPIREAT命令的基本语法。spa
1 redis 127.0.0.1:6379> Expireat KEY_NAME TIME_IN_UNIX_TIMESTAMP
示例
首先,在Redis中建立一个键:akey
,并在akey
中设置一些值。
1 redis 127.0.0.1:6379> SET akey redis 2 OK
如今,为设置建立的键设置超时时间为60 秒。
1 127.0.0.1:6379> SET akey redis 2 OK 3 127.0.0.1:6379> EXPIREAT akey 1393840000 4 (integer) 1 5 127.0.0.1:6379> EXISTS akey 6 (integer) 0 7 127.0.0.1:6379> SET akey redis 8 OK 9 127.0.0.1:6379> EXPIREAT akey 1493840000 10 (integer) 1 11 127.0.0.1:6379> EXISTS akey 12 (integer) 1
其余三个用法相似,这里不逐一阐述
对字符串特殊处理的方式为SETEX命令,SETEX命令为指定的 key 设置值及其过时时间。若是 key 已经存在, SETEX 命令将会替换旧的值。
返回值
设置成功时返回 OK 。
语法
Redis Setex 命令基本语法以下:
redis 127.0.0.1:6379> SETEX KEY_NAME TIMEOUT VALUE
示例
1 redis 127.0.0.1:6379> SETEX mykey 60 redis 2 OK 3 redis 127.0.0.1:6379> TTL mykey 4 60 5 redis 127.0.0.1:6379> GET mykey 6 "redis
看完上面三种策略后能够得出如下结论:
定时删除和按期删除为主动删除:Redis会按期主动淘汰一批已过去的key
惰性删除为被动删除:用到的时候才会去检验key是否是已过时,过时就删除
惰性删除为redis服务器内置策略
按期删除能够经过:
注意:
# 设置数据库数量。默认为16个库,默认使用DB 0,可使用"select 1"来选择一号数据库 # 注意:因为默认使用0号数据库,那么咱们所作的全部的缓存操做都存在0号数据库上, # 当你在1号数据库上去查找的时候,就查不到以前set过得缓存 # 若想将0号数据库上的缓存移动到1号数据库,可使用"move key 1" databases 16
惰性删除+按期删除
过时key对RDB没有任何影响
过时key对AOF没有任何影响
PS:若有问题,请留言,未经容许不得私自转载,转载请注明出处:http://www.cnblogs.com/xuliangxing/p/7151812.html