简介
Redis 是一款流行的开源 NoSQL 数据库,被广泛用于缓存、消息队列和排行榜等领域。其中,键值对是 Redis 最基本的数据结构,而每个键值对都可以设置一个生存时间(TTL),过期后会自动从数据库中删除。本文将详细介绍 Redis 中的生存时间机制,并提供示例代码以方便理解。
TTL 的设置
使用 Redis 命令 EXPIRE key seconds
可以为一个键值对设置生存时间,或者使用 SET key value EX seconds
在设置键值对的同时指定生存时间。例如:
> SET mykey "Hello" OK > EXPIRE mykey 10 (integer) 1 // 表示成功设置了 mykey 的生存时间为 10 秒钟
如果要取消已经设置的生存时间,可以使用命令 PERSIST key
。
> PERSIST mykey (integer) 1 // 表示成功取消了 mykey 的生存时间,mykey 将一直保存在数据库中
还有一个特殊值 -1
,表示将该键设置为永久存储。
> EXPIRE mykey -1 // cancel the lifetime (integer) 1
过期策略
Redis 中有两种过期策略:定时删除和惰性删除。
定时删除
定时删除是 Redis 最简单的过期策略。当一个键过期时,Redis 将其标记为要删除,并把它放入到一个任务队列中。 Redis 会每秒钟从队列中选出一部分键来删除,直到数据库中所有过期的键都被删除。
惰性删除
如果定时删除不能及时清除过期键,Redis 就会使用惰性删除策略。当用户尝试获取一个键值对时,Redis 首先检查它是否已经过期。如果过期则将其删除。这个机制使得不需要定期地遍历整个数据库以查找已过期的键,从而提高了性能。
过期通知
Redis 在数据库中删除一个键值对之前会先发送一个过期通知(expired event)。应用程序可以通过订阅 __keyevent@<db>__:expired
频道来接收过期通知。例如:
-- -------------------- ---- ------- -- ------- ---- ----- ----- - ----------------- ----- ------ - --------------------- -------------------- --------- -------- -- - ---------------- ---------- --- ---------- --- ------------------------------------------- -- -- -- - -------
注意事项
- 虽然 Redis 可以用于缓存,但使用 TTL 不等同于缓存的时间生命周期。如果你使用 Redis 作为缓存,应该遵循缓存的最佳实践,例如设置适当大小的缓存、设置 LRU 或 LFU 淘汰策略等。
- 使用 TTL 可能会导致内存泄漏。如果一个键被频繁更新,它的生存时间会被不断延长,从而导致数据库占用过多内存。避免出现这种情况的方法是使用定期刷新(refresh)替代 TTL 删除。
结论
Redis 中的键值对生存时间机制,以及其常见的过期策略和通知机制,为开发者提供了强大的工具,用于管理 Redis 数据库中数据的存储和删除。合理地使用 Redis 的生存时间功能可以有效地改善数据库性能,并减少内存占用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6729a8392e7021665e2538e9