首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Redis 缓存偶尔失效?三个常见坑与兜底策略(流程图+Key设计)

Redis 缓存偶尔失效?三个常见坑与兜底策略(流程图+Key设计)

作者头像
安全风信子
发布2025-11-18 18:51:57
发布2025-11-18 18:51:57
780
举报
文章被收录于专栏:AI SPPECHAI SPPECH

一句话承诺:给你流程图与Key设计清单,稳定常见场景下的“偶发失效”,避免读写错配与过期抖动。

三类问题总览

问题

症状

根因

兜底策略

过期抖动

突然大量命中DB

大量Key同一时间过期

过期时间加随机抖动

并发穿透

并发读写错配

先读后写未设置锁

使用mutex或分布式锁

空值穿透

缓存未命中反复DB查询

对不存在数据未缓存空值

空值缓存+短过期

Key 设计与代码片段

代码语言:javascript
复制
# Key 命名规范
app:module:entity:{id}
# 例如:shop:prod:detail:123
代码语言:javascript
复制
import redis, time, random
r = redis.Redis(host='localhost', port=6379)

LOCK_TTL = 5
CACHE_TTL = 300
JITTER = 60  # 随机抖动秒

def get_detail(prod_id):
    key = f"shop:prod:detail:{prod_id}"
    data = r.get(key)
    if data is not None:
        return data

    # 互斥锁避免并发穿透
    lock_key = key + ":lock"
    if r.set(lock_key, '1', nx=True, ex=LOCK_TTL):
        # 查询DB(伪代码)
        data = query_db(prod_id)
        if data is None:
            # 空值也缓存,避免穿透
            r.set(key, '', ex=60)
            r.delete(lock_key)
            return None
        # 设置随机过期,避免同一时刻大面积失效
        ttl = CACHE_TTL + random.randint(0, JITTER)
        r.set(key, data, ex=ttl)
        r.delete(lock_key)
        return data
    else:
        time.sleep(0.05)
        return r.get(key)

少量解释

  • 随机过期能有效打散缓存雪崩时刻。
  • 空值缓存可避免不存在的数据不断穿透DB。
  • 互斥锁(mutex)保证只有一个写入路径,其他并发请求等待。

常见坑与替代法

  • 坑:锁未设置过期导致死锁。替代:设置 ex 并在写入后删除锁。
  • 坑:空值缓存过期过长影响业务。替代:空值过期设置短周期(如60s)。
  • 坑:同一Key被多个模块写入。替代:统一Key命名规范并封装访问层。

下一篇预告

前端静态资源缓存控制:ETag/Last-Modified/Cache-Control 的最小组合(对照表)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三类问题总览
  • Key 设计与代码片段
  • 少量解释
  • 常见坑与替代法
  • 下一篇预告
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档