在实际的开发中经常会遇到一些有时效的数据,比如限时优惠活动、缓存或验证码等, 过了一定的时间就需要删除这些数据。
expire 命令
在Redis中可以使用 EXPIRE
命令设置一个键的过期时 间,到时间后Redis会自动删除它。
语法:
EXPIRE key seconds
:seconds 参数表示 key 的过期时间,单位为秒。
例如,让 key_session 键在 15 分钟后被删除:
redis 127.0.0.1:6379> set key_session uid1314
OK
redis 127.0.0.1:6379> expire key_session 900
(integer) 1
redis 127.0.0.1:6379>
EXPIRE命令返回1表示设置成功,返回0则表示键不存在或设置失败。
此外,还有两个命令可以设置过期时间:
PEXPIRE key milliscond
:区别是,这个命令的单位是毫秒
EXPIREAT key times
:这个命令的单位是时间戳
TTL命令
如果想知道一个键还有多久的时间会被删除,可以使用TTL命令。
redis 127.0.0.1:6379> TTL key_session
(integer) 702
redis 127.0.0.1:6379> TTL key_session
(integer) 696
redis 127.0.0.1:6379>
当键不存在时 TTL 命令会返回 −2
没有设置过期时间的键,TTL 返回值是 -1
persist 命令
persist
命令可以把一个关键字的使用期限删除掉。
redis 127.0.0.1:6379> TTL key_session
(integer) 654
redis 127.0.0.1:6379> persist key_session
(integer) 1
redis 127.0.0.1:6379>
除了
PERSIST
命令之外,使用SET
或GETSET
命令为键赋值也会同时清除键的过期时间
应用--实现缓存
为了提高网站的负载能力,常常需要将一些访问频率较高但是对CPU或IO资源消耗较大 的操作的结果缓存起来,并希望让这些缓存过一段时间自动过期。
比如教务网站要对全校所 有学生的各个科目的成绩汇总排名,并在首页上显示前10名的学生姓名,由于计算过程较耗资源,所以可以将结果使用一个 Redis 的字符串键缓存起来。由于学生成绩总在不断地变化,需要每隔两个小时就重新计算一次排名,这可以通过给键设置过期时间的方式实现。每次用户访问首页时程序先查询缓存键是否存在,如果存在则直接使用缓存的值;否则重新计算排名并将计算结果赋值给该键并同时设置该键的过期时间为两个小时。
然而在一些场合中这种方法并不能满足需要。
当服务器内存有限时,如果大量地使用缓 存键且过期时间设置得过长就会导致 Redis 占满内存;另一方面如果为了防止 Redis 占用内存过大而将缓存键的过期时间设得太短,就可能导致缓存命中率过低并且大量内存白白地闲置。
实际开发中会发现很难为缓存键设置合理的过期时间,为此可以限制 Redis 能够使用的最大内存,并让Redis按照一定的规则淘汰不需要的缓存键,这种方式在只将Redis用作缓存系统时非常实用。
具体的设置方法为:修改配置文件的maxmemory参数,限制Redis最大可用内存大小(单位是字节),当超出了这个限制时Redis会依据maxmemory-policy参数指定的策略来删 除不需要的键直到Redis占用的内存小于指定内存。
maxmemory-policy支持的规则如表:
规则 | 说明 |
---|---|
volatile-lru | 使用 LRU 算法删除一个键(只对设置了过期时间的键) |
allkeys-lru | 使用 LRU 算法删除一个键 |
volatile-random | 随机删除一个键(只对设置了过期时间的键) |
allkeys-random | 随机删除一个键 |
volatile-ttl | 删除过期时间最近的一个键 |
noeviction | 不删除键,只返回错误 |
其中的LRU(Least Recently Used)算法即“最近最少使用”,其认为最近最少使用的键在未来一段时间内也不会被用到,即当需要空间时这些键是可以被删除的。