Skip to content

逻辑过期方案

一、核心思路

  1. Redis 不对 Key 设置物理过期时间,不会主动删除缓存数据,在缓存 Value 中额外存储 expire 逻辑过期时间戳。
  2. 缓存数据永久驻留 Redis,从根源避免因物理过期引发的缓存击穿。

二、执行流程

线程1(成功获取分布式锁)

  1. 查询缓存,对比当前时间与逻辑过期时间戳,判定数据已逻辑过期。
  2. 成功获取分布式互斥锁。
  3. 开启异步子线程,查询数据库、更新Redis缓存并刷新逻辑过期时间戳。
  4. 主线程直接返回旧缓存数据,请求不阻塞。

线程2、线程3(抢锁失败)

无法获取分布式锁,直接返回当前旧缓存数据,全程不会访问数据库。

线程4(后续正常请求)

异步线程已完成缓存刷新,逻辑过期时间同步更新,请求直接命中最新有效缓存。

三、优缺点

优点

  1. 所有请求均不阻塞,接口吞吐量高,用户体验良好。
  2. 有效避免大量并发请求同时访问数据库,彻底解决缓存击穿问题。

缺点

会短暂返回过期数据,无法保证数据实时一致性。适用于商品首页、热点文章等可容忍短时脏读的业务场景。

四、与互斥锁方案对比

  • 分布式互斥锁:抢锁失败的请求会阻塞等待,数据强一致,但会增加请求耗时、降低吞吐量。
  • 逻辑过期:抢锁失败直接返回旧数据,请求无阻塞、吞吐能力强,需容忍短暂数据不一致。

五、补充说明

该方案底层依托 Redisson 分布式锁 实现。

六、面试高频问题解析

  1. 问:简述逻辑过期方案的实现思路?

    答: 不给缓存Key设置物理过期时间,在数据中嵌入逻辑过期时间戳。数据逻辑过期后,仅一个线程获取锁并开启异步线程更新缓存,其余请求直接返回旧数据,以此防止大量请求击穿数据库。

  2. 问:逻辑过期方案有什么优缺点,适合哪些业务?

    答: 优点是请求无阻塞、并发性能高;缺点是会短暂返回过期数据,无法做到强一致。适合商品展示、资讯文章等允许短时数据不一致的业务。

  3. 问:逻辑过期和分布式互斥锁两种方案怎么选型?

    答: 对数据实时性要求高,优先使用分布式互斥锁;追求高并发吞吐量、可容忍短暂脏读,选择逻辑过期方案。

  4. 问:逻辑过期方案依赖什么组件?

    答: 底层依赖 Redisson 实现分布式锁,控制只有一个线程执行缓存更新操作。

Powered by VitePress 1.6.4 | 持续更新中