在使用 Redis 缓存数据时,有时我们需要设置一个 key 在一定时间后自动过期。当数据过期时,Redis 应该自动删除这个 key,以释放内存空间。那么,Redis 中如何实现自动删除过期的 key 呢?
Redis 过期时间
Redis 中的每个 key 都可以设置一个过期时间(expire time),表示这个 key 在多长时间后过期。可以使用 EXPIRE 命令设置 key 的过期时间,例如:
> SET mykey "Hello" OK > EXPIRE mykey 10 # 设置 mykey 10 秒后过期 (integer) 1
在设置了 key 的过期时间之后,可以使用 TTL 命令查看 key 的剩余过期时间:
> TTL mykey (integer) 9 # 剩余 9 秒
当 key 的过期时间为 0 时,表示这个 key 已经过期了。
Redis 过期策略
Redis 中有两种过期策略:
定期删除:Redis 定期(默认每秒)扫描数据库中的 key,如果发现有过期的 key,就删除它。
惰性删除:Redis 在获取某个 key 时,会先检查这个 key 是否过期,如果过期了就删除它。
这两种策略各有优缺点。定期删除策略可以在一定程度上减少 Redis 的内存占用,但有可能会导致过期的 key 大量积累,从而影响 Redis 的性能。惰性删除策略可以避免过期 key 大量积累的问题,但可能会导致 Redis 内存占用过高。
为了在性能和内存占用之间取得平衡,Redis 采用了折中的方案:每次执行惰性删除时,随机选择一些 key 进行删除。这样可以避免过期 key 大量积累,同时不会影响 Redis 的性能。
Redis 自动删除过期 key
Redis 中可以使用过期时间和过期策略来自动删除过期的 key。具体来说,通过设置过期时间和合理的过期策略,可以使 Redis 在运行时自动删除过期的 key,从而释放内存空间。
设置过期时间
在 Redis 中,可以使用 EXPIRE 或 PEXPIRE 命令设置 key 的过期时间。例如:
> SET mykey "Hello" OK > EXPIRE mykey 10 # 设置 mykey 10 秒后过期 (integer) 1
还可以使用 EXPIREAT 或 PEXPIREAT 命令设置 key 的过期时间,这两个命令接收一个 UNIX 时间戳作为参数,表示 key 在该时间点后过期。例如:
> SET mykey "Hello" OK > EXPIREAT mykey 1609424133 # 设置 mykey 在 2020 年 12 月 31 日过期 (integer) 1
使用过期策略
Redis 中的两种过期策略各有优缺点,可以根据实际情况选择合适的过期策略。
为了避免过期 key 大量积累的问题,可以通过修改 Redis 配置文件(redis.conf)中的以下参数来调整惰性删除的策略:
maxmemory:指定 Redis 最大使用的内存容量。
maxmemory-policy:指定 Redis 内存达到上限时采取的策略,可以为 noeviction(不进行清理)、volatile-lru(按照虚拟内存 LRU 算法清理过期 key)、volatile-ttl(按照剩余过期时间清理过期 key)等。
maxmemory-samples:指定惰性删除时随机采样的 key 的数量。
监控过期 key
除了设置过期时间和过期策略外,还可以通过监控 Redis 中的 key 来实现自动删除过期的 key。具体来说,可以使用 Redis 提供的 Expired Events(过期事件)来监控过期的 key,然后在事件处理程序中删除这些 key。可以使用以下命令订阅 Expired Events:
> PSUBSCRIBE __keyevent@0__:expired
该命令将让 Redis 订阅所有数据库(编号为 0)中的 key 过期事件。当有过期 key 时,Redis 将发布一个消息给订阅者,消息的频道为 keyevent@0:expired,消息体为过期的 key,可以通过以下命令来处理这些消息:
-- -------------------- ---- ------- - --------- ---------------------- ------- ----------- ------ ------ -- ----- -- ----------- -- ------------------------ -- --------- - - ------ --- ---------------------- -- - -------- -- - ---------- ---------------------- - ---- --- -- ------- ----------- ------ ------ -- ----- -- ------------ -- ------------------------ -- --------- - - ---- ----- - ---- --- -- ------- - ------ ----- - - -- --- - ---- --- -- - - --- -------- -------- ---------------------- ----- - ----- --- -- - --- ----- --------- -
总结
通过设置过期时间、过期策略和监控过期 key,可以实现 Redis 自动删除过期的 key,从而释放内存空间,提高系统性能。需要注意的是,定期删除策略和惰性删除策略各有优缺点,应根据实际情况选择适合的策略。同时,为了避免过期 key 大量积累的问题,还可以定期清理过期的 key。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66444472d3423812e4226166