Redis对键提供生存时间,在不指定生存时间时,生存时间是永久。时间到期后Redis会自动删除这个键。可以用EXPIRE命令,时间单位时秒,如果一个键是被设为有限的生存时间,那么在SET key进行重新赋值的时候会被再次设为永久:

SET session:captcha sd2a
EXPIRE session:captcha 600

取消生存时间,将键的生存时间设为永久,是PERSIST:

PERSIST session:captcha

查看一个键的生存时间用TTL命令,-1表示永久或者以及到期被删除。

TTL session:captcha

在Redis的INCR,LPUSH,HSET,ZREM等命令时不会改变生存时间的。
想要精确到毫米来控制时间,就需要PEXPIRE即可,使用PTTL查看剩余时间。
如果想要给定一个到期的时间而不是多少秒后到期呢?就需要EXPIREAT和PEXPIREAT。EXPIREAT的参数是到期时的时间戳(秒),PEXPIREAT的参数是到期时间是时间戳(毫秒)

SET session:captcha sd2a
EXPIREAT session:captcha 1399902009
PEXPIREAT session:captcha 1399902009000

应用场景一:访问频率限制:我们限定每个用户1分钟只能浏览10个页面。伪代码如下:

$isExists = EXISTS limit:user1:192.168.1.2
if($isExists){
    $num = INCR limit:user1:192.168.1.2
    if($num > 10){
        print '超过限制'
        exit
    }
}else{
    MULTI
    INCR limit:user1:192.168.1.2
    EXPIRE limit:user1:192.168.1.2 60
    EXEC
}

我们用了事务的原因是因为,加入在执行了INCR limit:user1:192.168.1.2之后,在执行EXPIRE limit:user1:192.168.1.2 60之前,客户端被关闭了。那么这个键和值就会被持久化保存。且该ID终身只能访问10次了。这就太糟糕了。

应用场景二:实现缓存。计算一万名用户的排行榜,是很耗费资源的,那么我们把数据在第一次计算后存进一个key,然后对这个key设置生存时间。在1个小时后生存时间到期,key被删除,再次进行计算新排名并保存的一个临时key。我们用伪代码实现:

//战斗排行榜
$rank = GET cache:rank:fight
if not $rank
    $rank = 计算排名()
    MULTI
    SET cache:rank:fight $rank
    EXPIRE cache:rank:fight 3600
    EXEC

Redis是内存存储的数据库,假如内存被缓存占满了,Redis会根据配置文件来删除一定的缓存。配置项是Redis的配置文件中的maxmemory参数,单位是字节。超过这个限制之后,会根据配置文件的maxmemory-policy参数来删除不需要的键。maxmemory-policy的可选规则是如下四种:
1、volatile-lru:使用LRU算法删除一个键(设置了生存时间的键)。
2、allkey-lru:使用LRU算法删除一个键。
3、volatile-random:随即删除一个键(设置了生存时间的键)。
4、allkey-random:随即删除一个键。
5、volatile-ttl:删除生存时间即将过期的一个键。是随即取出来N个键,然后删除N个键中即将过期的键,而不是遍历所有的键删除即将过期的。N是几?配置文件配的。
6、nevication:不删除,返回错误。

标签: Redis, 生存时间

添加新评论