redis过期策略

定时删除
redis会将每个设置了过期时间的key放入一个独立的字典当中,以后会定时遍历这个字典来删除到期的key。
惰性删除
除了定时遍历之外,他还会使用惰性策略来删除过期的key。所谓惰性策略就是在客户端访问这个key的时候,redis对key的过期时间进行检查,如果过期了就立即删除。如果说定时删除是集中处理,那么惰性删除就是零散删除。

定时扫描策略
1.从过期字典中随机选出20个key
2.删除这20个key中已经过期的key
3.如果过期的key的比例超过四分之一,那就重复步骤1
同时,为了保证过期扫描不会出现循环过度,导致线程卡死的现象,算法还增加了扫描时间的上限,默认不会超过25ms。

删除key
Redis4.0以前,删除指令是del,del会直接释放对象的内存,大部分情况下,这个指令非常快,没有任何延迟的感觉。但是,如果删除的key是一个非常大的对象,比如一个包含了千万元素的hash,那么删除操作就会导致单线程卡顿,Redis的响应就慢了。为了解决这个问题,在Redis4.0版本引入了unlink指令,能对删除操作进行“懒”处理,将删除操作丢给后台线程,由后台线程来异步回收内存。
实际上,在判断key需要过期之后,真正删除key的过程是先广播expire事件到从库和AOF文件中,然后在根据redis的配置决定立即删除还是异步删除。
如果是立即删除,Redis会立即释放key和value占用的内存空间,否则,Redis会在另一个bio线程中释放需要延迟删除的空间。

Redis的内存淘汰机制
noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,移除最近最少使用的 key(这个是最常用的)。
allkeys-random:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,随机移除某个 key。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,移除最近最少使用的 key。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,随机移除某个 key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,有更早过期时间的 key 优先移除。

从节点的过期策略
从节点不会进行过期扫描,从节点对过期的处理是被动的。主节点在key到期的时候,会在aof文件里面增加一条del指令,同步到所有的从节点,从节点通过执行这条del指令来删除过期的key。

Redis 提供了丰富的键过期策略和机制,以支持灵活的数据生命周期管理。在 Redis 中,可以通过设置键的生存时间(TTL, Time To Live)来控制键的自动删除行为。一旦键的 TTL 过期,它将被自动从数据库中移除。 ### 键的过期设置 Redis 支持多种方式为键设置过期时间: - **EXPIRE**:以秒为单位设置键的生存时间。 - **PEXPIRE**:以毫秒为单位设置键的生存时间。 - **EXPIREAT**:指定一个绝对时间点(Unix 时间戳,以秒为单位),当到达该时间点时,键将失效。 - **PEXPIREAT**:与 `EXPIREAT` 类似,但以毫秒为单位指定绝对时间点。 例如: ```bash SET mykey "Hello" EXPIRE mykey 60 # 设置键 mykey 的生存时间为 60 秒 ``` ### 键的过期策略 Redis 实现了以下几种主要的过期策略来平衡性能和内存使用: 1. **惰性删除(Lazy Expiration)** Redis 不会主动检查并删除已过期的键,而是等到客户端尝试访问某个键时才检查其是否过期。如果键已经过期,则将其删除并返回空值给客户端。这种策略的优点是节省 CPU 资源,但可能导致过期键长时间驻留在内存中,直到被访问为止。 2. **定期删除(Active Expiration)** Redis 每隔一段时间(默认每 100 毫秒)会随机检查一部分设置了过期时间的键,并删除其中已经过期的键。这一过程是渐进式的,不会一次性扫描所有键,从而避免对性能造成显著影响。这种方式可以在一定程度上减少内存浪费,同时保持系统的响应速度。 3. **混合模式** Redis 实际采用的是惰性删除和定期删除相结合的方式。这样既保证了大部分情况下不会因为检查过期键而消耗过多资源,又能及时清理掉一些长期未被访问但仍过期的键。 ### 过期键的存储结构 为了高效地处理设置了过期时间的键,Redis 使用了一个专门的字典(称为 `expires` 字典)来保存这些键及其对应的过期时间。每个设置了过期时间的键都会在这个字典中有一个条目,键本身仍然存在于主字典中,但其过期时间则记录在 `expires` 字典中。 ### 查看过期时间 用户可以使用以下命令来查询键的过期时间: - **TTL**:返回键的剩余生存时间(以秒为单位)。如果键没有设置过期时间,则返回 `-1`;如果键不存在或已过期,则返回 `-2`。 - **PTTL**:与 `TTL` 类似,但返回值是以毫秒为单位的剩余生存时间。 例如: ```bash TTL mykey ``` ### 复杂度与性能考虑 对于大多数实际应用场景来说,Redis 的键过期机制是非常高效的。然而,在某些极端情况下,比如大量键在同一时间点过期,可能会导致短暂的性能波动。为了避免这种情况,建议合理分布键的过期时间,或者通过程序逻辑引入一定的随机性来分散过期时间。 此外,需要注意的是,当数据量较大且频繁设置过期时间时,定期删除操作可能无法完全覆盖所有过期键,因此系统内存占用可能会有所增加。在这种情况下,可以适当调整 Redis 的配置参数(如 `maxmemory` 和 `maxmemory-policy`)来优化内存使用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值