Redis是一种高性能的键值存储数据库,它支持为每个键设置一个过期时间,当过期时间到达时,键会自动被删除,从而释放内存空间。这种机制可以用来实现缓存、会话、限速等功能。本文将介绍如何在Redis中设置和查询键的过期时间,以及过期时间的一些注意事项。
设置键的过期时间有两种方式:一种是在创建键的时候就指定一个过期时间,另一种是在创建键之后再用expire命令设置一个过期时间。例如:
上面的例子中,我们为name键设置了一个10秒的过期时间,为age键设置了一个20秒的过期时间。如果不指定单位,默认是秒。也可以用px参数指定毫秒为单位。例如:
上面的例子中,我们为name键设置了一个10毫秒的过期时间。
查询键的过期时间有两种方式:一种是用ttl命令返回键的剩余生存时间,另一种是用pttl命令返回键的剩余生存时间,以毫秒为单位。例如:
上面的例子中,我们分别用ttl和pttl命令查询了name键的剩余生存时间,分别是8秒和8000毫秒。
如果一个键没有设置过期时间,或者已经过期被删除了,那么ttl和pttl命令会返回-1或者-2。例如:
上面的例子中,我们查询了age键的剩余生存时间,结果是-2,表示该键已经不存在了。
需要注意的是,Redis的过期时间并不是精确的,而是基于一种惰性删除和定期删除的策略实现的。惰性删除是指当一个键被访问时,Redis会检查该键是否已经过期,如果是,则删除该键并返回nil;定期删除是指Redis每隔一段时间会扫描一部分键,并删除其中已经过期的键。这样做的目的是为了平衡内存和性能之间的关系,避免一次性删除大量的过期键造成阻塞。
另外,还有一些特殊情况会影响键的过期时间,例如:
1.如果一个键被重命名,那么它的过期时间会保留。
2.如果一个键被持久化到磁盘,那么它的过期时间也会被保存,并在加载时恢复。
3.如果一个键被复制到从节点,那么它在从节点上也会有相同的过期时间。
4.如果一个键被订阅或发布,那么它不会被删除。
5.如果一个哈希、列表、集合或有序集合类型的键只剩下一个元素,那么它也不会被删除。