Redis复习记录day1

Redis 数据过期后的删除策略是什么?

常见的过期删除策略有:

过期删除策略分类

策略名称 描述 优势 劣势
惰性删除 仅在访问键时检查是否过期,若过期则删除。 对 CPU 友好,减少非必要操作。 大量过期键未被访问时仍占用内存。
定期删除 周期性随机检查部分键,若过期则删除。 减少内存占用,较为均衡。 对 CPU 有一定消耗,不能保证及时删除所有过期键。
定时删除 每个设置了过期时间的键,到期时立即删除(通过定时器实现)。 确保及时删除,内存无过期键残留。 需要为每个键创建定时器,对 CPU 资源消耗较大。
延迟队列(扩展) 将过期键放入延迟队列,到期时删除。 确保过期键被删除,内存无残留。 维护队列复杂,增加 Redis 的资源开销。

Redis 删除:定期删除 + 惰性删除

Redis 并未采用单一删除策略,而是结合了以下两种方式以平衡内存和性能:

策略 实现方式
惰性删除 当客户端访问一个键时,Redis 会检查其是否过期,若过期则立即删除。
定期删除 Redis 每隔一段时间(由 hz 配置控制)会随机抽样部分设置了过期时间的键,检查并删除已过期的键。

定期删除的细节

  • Redis 会周期性执行过期键检查,默认每秒执行 10 次(通过 hz=10 配置)。
  • 每次检查会随机抽取部分键(默认每次 20 个),判断是否过期。
  • 为避免过多 CPU 占用,Redis 限制检查的执行时间(默认 25 毫秒)和过期键的比例(默认 10%)。
  • 如果过期键比例超过限制,则会重复检查以提高清理效率。

在 Redis 7 中阙值设定为 25ms, 过期 key 比率设置为 10%

复制代码
/* Microseconds. */
#define ACTIVE_EXPIRE_CYCLE_FAST_DURATION 1000

/* Max % of CPU to use. */
#define ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC 25 

/* % of stale keys after which*/
#define ACTIVE_EXPIRE_CYCLE_ACCEPTABLE_STALE 10 

那么一次 ⌈随机抽查⌋ 的数量是多少呢?

expire.c

复制代码
/* Keys for each DB loop. */
#define ACTIVE_EXPIRE_CYCLE_KEYS_PER_LOOP 20 

设置定期删除执行的频率

redis.conf配置文件内配置项: hz

  • 默认值 10, 代表每秒执行 10 次。表示每秒执行 10 次来查找过期删除的 key

问题: 为什么定期删除不直接把所有过期 key 都删除呢?

分情况来看

定期删除 不清理所有过期键的原因:

  • 如果一次性清理所有过期键,可能会导致 Redis 长时间阻塞,影响性能。
  • 随机抽样和时间限制的方式能够在清理内存和性能之间取得平衡。

惰性删除 不能直接清理所有过期键的原因:

  • 惰性删除只在访问键时触发,未被访问的过期键会继续占用内存,无法主动清理。

(扩展) 如何优化大量 key 集中过期呢?

当大量键同时到期时,可能会出现以下问题:

  1. 请求延迟增加:Redis 删除过期键会消耗大量 CPU 资源,影响正常请求。
  2. 内存占用过高:未及时删除的过期键会继续占用内存。

解决方案

方法 描述
随机化过期时间 在设置键的过期时间时,增加随机值,避免大量键在同一时间过期。
开启 Lazy Free 机制 配置 lazyfree-lazy-expire,让过期键的删除操作由后台线程异步执行,减少主线程占用。

Redis 中有哪些内存淘汰策略?

Redis 的 Lua 脚本功能是什么?如何使用?

Redis 的 Pipeline 功能是什么?

Redis 中的 Big Key 问题是什么?如何解决?

Redis 的持久化机制有哪些?

Redis 在生成 RDB 文件时如何处理请求?

Redis 的哨兵机制是什么?

Redis 集群会出现脑裂问题吗?

Redis 的订阅发布功能是什么?你了解吗?

Redis 中如何实现分布式锁?

说说 Redisson 分布式锁的原理?

Redisson 看门狗(watch dog)机制了解吗?

Redisson 看门狗(watchdog)可防止 Redis 锁在业务未完成时超时释放,通过定期刷新过期时间自动续期。

1. 主要原理

定时刷新:未设过期时间时,基于 Netty 时间轮每 10 秒向 Redis 发命令,每次续期 30 秒。

释放锁:主动释放锁取消刷新;客户端宕机,超时后锁自动释放。

2. 核心方法

scheduleExpirationRenewal(启动续期)

获锁后创建 ExpirationEntry(过期条目)添加到续期 map。

若已存在,说明已有其他线程在续期该锁,则添加当前线程 ID 到现有条目中。

如果首次创建条目,则启动renewExpiration,开始进行锁的续期。

如果当前线程被中断(发生异常或unlock解锁),则取消续期。

renewExpiration(刷新过期时间)

从续期 map 获取锁的过期条目,有则创建定时任务(取30 秒的1/3),

任务中检查线程 ID 后异步续期,成功重调度,失败取消续期。

3. 其他

续期条件:不设 leaseTime(超时时间)才有自动续期。

客户端宕机:定时任务终止,30 秒后其他客户端可获锁。

缩短等待宕机时间 :紧急时删 Redis 对应 key;或用lockWatchdogTimeout修改超时时间。

分布式锁在未完成逻辑前过期怎么办?

相关推荐
njidf2 小时前
实战:用Python开发一个简单的区块链
jvm·数据库·python
龙俊俊2 小时前
服务器模型部署与加载
服务器·人工智能·深度学习
小菜鸡桃蛋狗2 小时前
C++——类和对象(下)
开发语言·c++
骑龙赶鸭2 小时前
java开发项目中遇到的难点,面试!
java·开发语言·面试
Rick19932 小时前
慢SQL优化
数据库·python·sql
张人玉2 小时前
C#通讯(上位机)常用知识点
开发语言·c#·通讯·上位机开发
IvorySQL2 小时前
速抢!HOW 2026 早鸟票最后 1 天,解锁开源数据库盛会全亮点
数据库·postgresql·开源
NGC_66112 小时前
Java线程池七大核心参数介绍
java·开发语言
crescent_悦2 小时前
C++:Highest Price in Supply Chain
开发语言·c++