HoRain云--如何使用Redis来防止穿透、击穿和雪崩问题

  

🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

1. 缓存穿透

2. 缓存击穿

3. 缓存雪崩

其他通用优化


img


1. 缓存穿透

问题描述:大量请求查询不存在的数据(如恶意攻击),导致请求直接穿透缓存层,频繁访问数据库。

Redis 解决方案

  • 布隆过滤器(Bloom Filter)
    在 Redis 缓存层前增加布隆过滤器,过滤非法请求。

    # 示例:使用 RedisBloom 模块(需提前安装)
    # 将合法数据的 key 预先存入布隆过滤器
    BF.ADD legitimate_keys user_123
    # 查询时先检查布隆过滤器
    exists = BF.EXISTS legitimate_keys user_456  # 返回 0 表示不存在,直接拦截
    
  • 缓存空值(Null Caching)
    对查询结果为 null 的请求,缓存一个短期的空值。

    # 设置空值,并设置较短的过期时间(如 5 分钟)
    SET user_456 "null" EX 300
    

2. 缓存击穿

问题描述:某个热点 key 突然过期时,大量并发请求直接击穿缓存,导致数据库压力骤增。

Redis 解决方案

  • 互斥锁(Mutex Lock)
    使用 Redis 的 SETNX(或 SET key value NX EX)实现分布式锁,确保只有一个线程重建缓存。

    # 获取锁
    lock_acquired = redis.set("lock:user_123", "1", nx=True, ex=10)
    if lock_acquired:
        # 查询数据库并重建缓存
        data = db.query("SELECT * FROM users WHERE id = 123")
        redis.set("user_123", data, ex=3600)
        redis.delete("lock:user_123")
    else:
        # 等待或返回默认值
        time.sleep(0.1)
        return redis.get("user_123")
    
  • 逻辑过期(Logical Expiration)
    在 value 中存储过期时间,异步更新缓存。

    # 存储数据时附加逻辑过期时间
    value = {
        "data": "实际数据",
        "expire_time": time.time() + 3600
    }
    redis.set("user_123", json.dumps(value), ex=7200)  # 物理过期时间更长
    

3. 缓存雪崩

问题描述:大量缓存 key 同时过期或 Redis 节点宕机,导致所有请求直接访问数据库。

Redis 解决方案

  • 随机过期时间
    为 key 设置基础过期时间 + 随机偏移量,避免同时失效。

    # 设置过期时间为 1 小时 ± 10 分钟随机值
    expire_time = 3600 + random.randint(-600, 600)
    redis.set("user_123", data, ex=expire_time)
    
  • 高可用架构
    使用 Redis 集群(Cluster 或 Sentinel)避免单点故障。

    # 配置 Redis Sentinel 监控主从节点
    sentinel monitor mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 5000
    
  • 降级与熔断
    在缓存失效时,启用限流或返回默认值,保护数据库。

    # 使用 Redis 计数器限流
    current = redis.incr("request_count")
    if current > 1000:
        # 返回兜底数据或错误提示
        return "系统繁忙,请稍后重试"
    

其他通用优化

  • 预热缓存:系统启动时加载热点数据。
  • 多级缓存:结合本地缓存(如 Caffeine)和 Redis,减少穿透压力。
  • 监控告警:监控缓存命中率、Redis 节点状态,及时调整策略。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值