redis怎么处理过期的key
-
Redis处理过期的key的方法有以下几种:
-
周期性删除:Redis会在每次执行RDB或者AOF持久化操作时,检查key是否过期,然后进行删除。这个过程是在后台进行的,对于用户是透明的。
-
惰性删除:当用户尝试获取一个已经过期的key时,Redis会立即删除该key,并返回空值。这样可以保证被删除的过期key不会占用内存空间。
-
定期删除:Redis会使用一个定时器(默认为每隔100ms执行一次)来检查部分过期的key,然后进行删除。这个过程是在后台进行的,对于用户是透明的。
-
主动删除:可以通过调用
EXPIRE命令或者EXPIREAT命令手动设置key的过期时间,也可以通过调用DEL命令手动删除已经过期的key。 -
基于惰性删除的内存淘汰策略:当Redis的内存达到限制时,会根据一定的策略选择一些key进行删除,其中包括过期的key。Redis目前支持6种不同的内存淘汰策略,如
noeviction、allkeys-lru、volatile-lru、allkeys-random、volatile-random和volatile-ttl。
总结起来,Redis处理过期的key主要依靠周期性删除、惰性删除和定期删除等机制,同时也可以通过手动操作和内存淘汰策略来管理过期的key。
1年前 -
-
Redis 是一种基于内存的键值对存储系统,在处理过期的 key 方面提供了一些机制。下面是 Redis 处理过期 key 的方式:
-
定时删除:Redis 通过定时任务来删除过期的 key。每个 key 都有一个过期时间,Redis 会定期检查 key 是否过期,并删除已过期的 key。这个定期检查是通过一个叫做 "定时器" 的结构来实现的。
-
惰性删除:当用户请求访问一个 key 时,Redis 会首先检查这个 key 是否过期。如果 key 已经过期,Redis 会在此时删除该 key,并返回空值给用户。
-
定期删除:除了定时删除外,Redis 还会在每次执行一定数量的写操作时(通过配置参数
hz来设置),随机选择一些已经过期的 key 进行删除。这样可以保证系统不会因为过期 key 过多而占用过多的内存。 -
清除算法:Redis 内部使用了一种叫做 "定期淘汰算法" 的算法来清除过期的 key。这个算法的思想是随机抽样检查一部分 key 是否过期,并对过期的 key 进行删除。由于是随机抽样,所以整个过期 key 的清除过程是比较均匀的。
-
内存回收:当 Redis 的内存使用达到一定阈值时,Redis 会触发内存回收机制。在内存回收的过程中,Redis 会首先清除已经过期的 key,然后根据一定的策略来清理其他占用内存的数据。这样可以确保系统在内存使用达到极限时不会发生崩溃。
1年前 -
-
在Redis中,处理过期的key是通过设置过期时间来实现的。Redis提供了两种处理过期key的方式,分别是惰性删除和定期删除。
-
惰性删除(Lazy deletion)
惰性删除是指在访问某个key时,先检查该key是否过期,如果过期则删除该key。这种方式可以避免了定期删除带来的性能问题,但是会导致过期key一直保存在内存中,占用一定的内存空间。 -
定期删除(TTL-based eviction)
定期删除是指在Redis的每个数据库中,通过设置一个定时任务来以一定的频率去主动检查过期key并删除。Redis默认每秒钟随机检查一定数量的过期key以及一定数量的非过期key,并删除其中的过期key。
下面是定期删除的具体操作流程:
- Redis在每个数据库中使用一个字典结构(dict)来保存键值对数据。
- 在字典中,Redis每一个key都会维护一个ttl(time to live)字段,用于记录该key的过期时间。
- Redis内部有一个定时任务,每秒钟会随机检查一定数量的key的过期时间,并删除过期的key。
- Redis通过遍历字典中的键值对,检查每个key的过期时间是否小于当前时间,如果小于则删除该key。
需要注意的是,过期key的删除是在使用key时发生的,所以删除过期key的时间是不确定的,而且在某些情况下会导致性能问题。如果需要更精确的控制过期key的删除时机,可以使用Redis的发布/订阅功能,订阅一个定时任务的频道,自己实现过期key的删除逻辑。
另外需要注意的是,当Redis服务器的内存使用量达到一定的阈值时,会触发内存淘汰策略,此时可能会删除一些数据以保持内存使用量在合理范围内。所以即使设置了过期时间,也不能完全保证数据一定会被保存在Redis中。
1年前 -