缓存过期时间之逻辑过期

1. 物理不过期(Physical Non-Expiration)
  • 定义 :在Redis中不设置EXPIRE时间,缓存键永久存在(除非主动删除或内存淘汰)。

  • 目的:彻底规避因缓存自动过期导致的击穿(单热点失效)和雪崩(多键集中失效)。

  • 数据示例 :

    复制代码
    SET user:1001:profile "{\"name\":\"Alice\",\"last_update\":1690000000}"  # 不设置TTL
2. 逻辑过期(Logical Expiration)
  • 定义:在缓存值的元数据中嵌入过期时间戳,业务层自行判断数据新鲜度。

  • 实现方式:

    复制代码
    {
      "data": "真实业务数据",
      "expire_time": 1690003600  // 逻辑过期时间戳
    }
  • 触发更新条件:

    • 定时任务扫描:后台线程周期性检查逻辑过期时间,主动更新临近过期的数据。
    • 被动触发更新:当业务请求发现数据逻辑过期时,触发异步更新(需结合降级策略)。
3. 后台异步更新(Background Update)
  • 技术实现 :

    • 独立线程池:与主业务线程隔离,避免更新操作阻塞正常请求。
    • 双缓冲机制:更新时生成新缓存副本,原子替换旧数据,避免脏读。
  • 流程图 :

    复制代码
    业务请求 → 读取缓存 → 判断逻辑过期 → 否 → 返回数据
                                  ↓是
                              发起到消息队列 → 后台Worker消费 → 更新DB → 刷新缓存

二、逻辑过期解决缓存击穿的实践

1. 缓存击穿(Cache Breakdown)
  • 传统问题场景:热点Key突然失效,瞬时高并发请求穿透至数据库。
  • 本方案优势 :
    • 无物理失效:热点Key永不自动删除,直接避免击穿触发条件。
    • 逻辑更新异步化 :即使业务认为数据过期,更新操作由后台线程异步处理,前端请求无需等待,降级返回稍旧数据或进入队列等待。
相关推荐
曹牧3 小时前
C#:空合并运算符
java·前端·数据库
布吉岛的石头3 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
golang学习记4 小时前
IDEA 2026年的玩法已经完全不同
java·ide·intellij-idea
紧跟先前的步伐4 小时前
Go AI Agent 实战 05|Temperature 与生成参数:让模型输出可控
java·人工智能·golang
金銀銅鐵4 小时前
[Java] 展示添加元素时 ArrayList 的内部变化
java·后端·ai编程
斌糖雪梨5 小时前
spring auth 核心流程详解
java·后端·spring
文丑颜不良啊6 小时前
LeetCode201~225题目解析
java·leetcode
SL_staff8 小时前
4G设备掉线三层归因指南:SIM卡、模组、JVS-IOT网关配置精准锁定
java·物联网·产品
hweiyu008 小时前
Redis命令:LLEN
redis·缓存
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 黑名单:取消黑名单
java·windows·交友