Redis可以通过对键设置过期时间来自动删除过期的键信息。当设置了一个过期时间后,过期时间会被存储为一个绝对的UNIX的时间戳。这样做的目的是即使Redis服务器宕机了一段时间,这个时间戳也会被持久化到RDB文件中,当Redis服务器启动时,这个用来判断键是否过期的时间戳不会发生变化,一旦超过了这个时间戳,键就过期了。

  在一个键过期后,客户端访问已经过期的键,Redis就会立即将其从内存中删除。Redis这种删除键的方式被称为被动过期。对于那些已经过期也不会被再次访问的键,Redis会定期运行一个基于概率的算法来进行主动删除。跟具体的就是Redis会选择设置了过期时间的20个键,在这20个键中已经过期的就立即删除,如果选中的键中25%的键已经过期被删除,那Redis会继续选择20个进行重复这个过程,该过程每秒钟运行10次,可通过配置文件的hz值进行设置。

清理键过期的方法:

  • 使用PERSIST命令使其成为持久的键;
  • 键的值被替换或被删除,都会清除过期时间。但是修改列表、集合、哈希不会清理过期时间,这里只是修改了元素信息,并没有操作键的信息;
  • 被另一个没有过期时间的键重命名;
相关命令

EXPIRE、EXPIREAT、TTL、PERSIST

相关操作

1、使用EXPIRE设置过期时间、TTL命令查看剩余时间

127.0.0.1:6379> LPUSH "user_ids" 123 456 234 156 888
(integer) 5
127.0.0.1:6379> TTL "user_ids" #如果没有过期时间,就返回-1
(integer) -1
127.0.0.1:6379> EXPIRE "user_ids" 100 #100设置为过期的相对时间,单位秒
(integer) 1
127.0.0.1:6379> TTL "user_ids"
(integer) 99
#等待99秒
127.0.0.1:6379> TTL "user_ids" #如果这个键不存在就返回-2
(integer) -2
127.0.0.1:6379> EXISTS "user_ids"
(integer) 0

2、使用PERSIST命令将键设置为持久的键

127.0.0.1:6379> LPUSH "user_ids" 123 456 234 156 888
(integer) 5
127.0.0.1:6379> EXPIRE "user_ids" 100
(integer) 1
127.0.0.1:6379> TTL "user_ids"
(integer) 98
127.0.0.1:6379> PERSIST "user_ids"
(integer) 1
127.0.0.1:6379> TTL "user_ids"
(integer) -1

注意:EXPIRE命令和EXPIREAT命令类似,EXPIREAT用来指定一个绝对的UNIX的时间戳。EXPIRE和EXPIREAT都可以
是毫秒级的精度来指定过期时间。

Redis对已经过期的键的主动删除是不可预料的,所以有些已经过期的键可能永远不会被删除。当发现有太多的键没有被删除掉的时候,可以使用SCAN命令来人为主动的删除过期的键。