过期操作
expire key seconds:设置 key 在 n 秒后过期;
示例:expire key 100
pexpire key milliseconds:设置 key 在 n 毫秒后过期;
示例:pexpire key2 100000
expireat key timestamp:设置 key 在某个时间戳(精确到秒)之后过期;
示例:expireat key3 1573472683
pexpireat key millisecondsTimestamp:设置 key 在某个时间戳(精确到毫秒)之后过期;
示例:pexpireat key4 1573472683000
小贴士:在 Redis 可以使用 time 命令查询当前时间的时间戳(精确到秒)
set key value ex seconds:设置键值对的同时指定过期时间(精确到秒);
示例:set k v ex 100
set key value px milliseconds:设置键值对的同时指定过期时间(精确到毫秒);
示例:set k2 v2 px 100000
setex key seconds valule:设置键值对的同时指定过期时间(精确到秒)。
示例:setex k3 100 v3
persist key
持久化过期的键:
- RDB
Rdb分为生成阶段和加载阶段。
生成阶段不会将过期的键写入到文件中。
加载阶段也不会加载过期的键。
- AOF
AOF持久化的时候,如果redis中有过期的键没有被删除,那么aof文件会保存该键,等到这个过期的键被删除的时候,再在aof文件追加一条del命令。
AOF重写会对aof文件进行检查,不会保存过期之后的键。
主从同步过期的键:
从库不会检查过期的键,只有等待主库过期删除同意一条删除的命令,才会删除过期的键。
过期策略
Redis 之所以能知道那些键值过期,是因为在 Redis 中维护了一个字典,存储了所有设置了过期时间的键值,我们称之为过期字典。
- 定时删除
在设置键值过期时间时,创建一个定时事件,当过期时间到达时,由事件处理器自动执行键的删除操作。优点是可以保证内存被尽快的释放,缺点是当出现大批量同时过期的键时,会影响redis的使用。
- 惰性删除
不主动删除过期键,每次从数据库获取键值时判断是否过期,如果过期则删除键值,并返回 null。优点是使用很少的资源去判断过期的键,缺点是会有一定的空间浪费
- 定期删除
Redis 默认每秒进行 10 次过期扫描,此配置可通过 Redis 的配置文件 redis.conf 进行配置,配置键为 hz 它的默认值是 hz 10。(Redis 每次扫描并不是遍历过期字典中的所有键,而是采用随机抽取判断并删除过期键的形式执行的。)
为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。