LaneBlog

Redis生存时间,对Redis的键设置生存时间

Redis生存时间的概念,是和编程语言一样,拥有Redis生命周期,对键设定永久生效或指定生效时间。Redis过期删除键和值。Redis的生存时间和Redis的生命周期如何使用,本篇会详细讲解。

Redis|生存时间
Redis对键提供生存时间,在不指定生存时间时,生存时间是永久。时间到期后Redis会自动删除这个键。可以用EXPIRE命令,时间单位时秒,如果一个键是被设为有限的生存时间,那么在SET key进行重新赋值的时候会被再次设为永久: [code] SET session:captcha sd2a EXPIRE session:captcha 600 [/code] 取消生存时间,将键的生存时间设为永久,是PERSIST: [code] PERSIST session:captcha [/code] 查看一个键的生存时间用TTL命令,-1表示永久或者以及到期被删除。 [code] TTL session:captcha [/code] 在Redis的INCR,LPUSH,HSET,ZREM等命令时不会改变生存时间的。 想要精确到毫米来控制时间,就需要PEXPIRE即可,使用PTTL查看剩余时间。 如果想要给定一个到期的时间而不是多少秒后到期呢?就需要EXPIREAT和PEXPIREAT。EXPIREAT的参数是到期时的时间戳(秒),PEXPIREAT的参数是到期时间是时间戳(毫秒) [code] SET session:captcha sd2a EXPIREAT session:captcha 1399902009 PEXPIREAT session:captcha 1399902009000 [/code] 应用场景一:访问频率限制:我们限定每个用户1分钟只能浏览10个页面。伪代码如下: [code] $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 } [/code] 我们用了事务的原因是因为,加入在执行了INCR limit:user1:192.168.1.2之后,在执行EXPIRE limit:user1:192.168.1.2 60之前,客户端被关闭了。那么这个键和值就会被持久化保存。且该ID终身只能访问10次了。这就太糟糕了。 应用场景二:实现缓存。计算一万名用户的排行榜,是很耗费资源的,那么我们把数据在第一次计算后存进一个key,然后对这个key设置生存时间。在1个小时后生存时间到期,key被删除,再次进行计算新排名并保存的一个临时key。我们用伪代码实现: [code] //战斗排行榜 $rank = GET cache:rank:fight if not $rank $rank = 计算排名() MULTI SET cache:rank:fight $rank EXPIRE cache:rank:fight 3600 EXEC [/code] 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:不删除,返回错误。
点击:21647
点赞:16
点踩:12