🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 | |
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! | |
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 | |
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 | |
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 | |
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙