一、缓存击穿 (Cache Breakdown)

原理
某个热点 Key 突然过期,同时大量并发请求该 Key,导致请求直接穿透缓存击穿到数据库。

解决方案

  1. 互斥锁 (Mutex Lock)
    当缓存失效时,仅允许一个线程重建缓存,其他线程等待。
  2. 逻辑过期
    不设置物理过期时间,在 Value 中存储过期时间戳,异步更新缓存。

Python 实现 (互斥锁方案)

import redis
import time
import threadingr = redis.Redis()def get_data(key):# 1. 尝试从缓存读取data = r.get(key)if data:return data# 2. 尝试获取锁 (SETNX + EXPIRE)lock_key = f"lock:{key}"if r.set(lock_key, "locked", nx=True, ex=5):  # 设置5秒锁过期try:# 3. 模拟数据库查询data_from_db = "Database Result"  # 真实场景需查DB# 4. 写入缓存r.setex(key, 60, data_from_db)  # 缓存60秒return data_from_dbfinally:r.delete(lock_key)else:# 5. 未获锁则短暂等待重试time.sleep(0.1)return get_data(key)  # 递归重试# 测试并发
def test_breakdown():key = "hot_key"threads = []for i in range(10):  # 模拟10个并发请求t = threading.Thread(target=lambda: print(get_data(key)))threads.append(t)t.start()for t in threads:t.join()test_breakdown()

二、缓存穿透 (Cache Penetration)

原理
请求访问数据库中不存在的数据(如非法ID),导致每次请求都穿透到数据库。

解决方案

  1. 布隆过滤器 (Bloom Filter)
    快速判断 Key 是否可能存在数据库中。
  2. 缓存空对象
    对不存在的数据也进行缓存(设置短过期时间)。

Python 实现 (缓存空对象)

def get_data_penetration(key):# 1. 尝试从缓存读取data = r.get(key)if data is not None:return None if data == b'NULL' else data  # 处理空值# 2. 查询数据库 (模拟不存在)data_from_db = None  # 假设数据库返回空if data_from_db is None:# 3. 缓存空对象 (5分钟过期)r.setex(key, 300, 'NULL')  # 特殊值标记return Noneelse:r.setex(key, 60, data_from_db)return data_from_db

三、缓存雪崩 (Cache Avalanche)

原理
大量 Key 同时过期,导致所有请求穿透到数据库,引发连锁故障。

解决方案

  1. 随机过期时间
    基础过期时间 + 随机值,分散 Key 过期时间。
  2. 热点数据永不过期
    后台异步更新缓存。
  3. 多级缓存架构
    本地缓存 + Redis 缓存。

Python 实现 (随机过期时间)

import randomdef set_data(key, value):# 基础过期时间 + 随机偏移 (0-300秒)expire = 3600 + random.randint(0, 300)r.setex(key, expire, value)# 批量设置缓存时使用
set_data("key1", "value1")
set_data("key2", "value2")

四、缓存预热 (Cache Warm-up)

原理
系统上线前预先加载热点数据到缓存,避免冷启动时大量请求穿透到数据库。

实现方式

  1. 手动触发脚本加载数据
  2. 定时任务预热
  3. 启动时自动加载

Python 实现

def cache_warm_up():hot_keys = ["news:1", "product:100", "top:list"]  # 预定义热点Keyfor key in hot_keys:if not r.exists(key):# 从数据库加载数据data = f"Data for {key}"  # 真实场景需查DBr.setex(key, 3600, data)  # 缓存1小时print(f"Preloaded: {key}")# 系统启动时执行
cache_warm_up()

总结对比表

问题核心原因解决方案关键实现技术
缓存击穿热点 Key 突然失效互斥锁、逻辑过期SETNX + EXPIRE
缓存穿透查询不存在的数据布隆过滤器、缓存空对象特殊值标记 (如’NULL’)
缓存雪崩大量 Key 同时过期随机过期时间、多级缓存基础过期时间 + 随机值
缓存预热冷启动时无缓存启动时加载热点数据初始化脚本加载

最佳实践:生产环境中建议组合使用多种方案(如布隆过滤器+空对象+互斥锁+随机过期时间),并配合监控系统实时检测缓存命中率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95148.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95148.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95148.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一周一个数据结构 第一周 --- 顺序表(下)

文章目录一、ArrayList的构造二、ArrayList常见操作三、ArrayList的遍历四、ArrayList练习1.【小练习】2.杨辉三角3.简单的洗牌算法五、ArrayList小结在上一章节中,我们通过代码示例以及画图的方式详细了解了顺序表,并模拟实现了它。那么,是不…

OpenCV的关于图片的一些运用

一、读取图片通过cv2库中的imread()方法读取图片代码:import cv2 a cv2.imread(1.png) cv2.imshow(tu,a) b cv2.waitKey(4000) # 图片执行时间 cv2.destroyAllWindows() # 关闭所有端口 print("图像形状(shape):",a.shape) print…

【数据结构——并查集】

引入 并查集(Disjoint Set Union,DSU)是一种用于管理元素分组的数据结构。 合并(Union):将两个不相交的集合合并为一个集合。 查找(Find):确定某个元素属于哪个集合&…

在 Vue 中使用 ReconnectingWebSocket实现即时通讯聊天客服功能

在 Vue 中使用 ReconnectingWebSocketReconnectingWebSocket 是一个自动重连的 WebSocket 实现,非常适合在 Vue 项目中使用。下面是如何在 Vue 中集成和使用它的方法:搜索 "程序员老狼"安装 ReconnectingWebSocket首先,你需要安装…

智能体革命:网络安全人的角色重塑与突围指南

AI赋能千行百业的趋势不可逆转,当AI学会渗透测试,安全工程师的出路在哪里? 2025年8月7日,OpenAI正式发布GPT-5的消息刷屏科技圈。这个达到博士生水平的“统一”人工智能模型,将AI幻觉率降低60%,成本下降45%…

用于水T1值和脂肪分数量化的上半身自由呼吸磁共振指纹成像|文献速递-医学影像算法文献分享

Title题目Upper-body free-breathing Magnetic Resonance Fingerprinting applied tothe quantification of water T1 and fat fraction用于水T1值和脂肪分数量化的上半身自由呼吸磁共振指纹成像 01文献速递介绍磁共振指纹成像(MRF)是十年前推出的一种高…

Apache RocketMQ:消息可靠性、顺序性与幂等处理的全面实践

Apache RocketMQ 是一个高性能、高可靠的分布式消息中间件,广泛应用于异步通信、事件驱动架构和分布式系统中。本文深入探讨 RocketMQ 的消息可靠性、顺序性和幂等处理机制,结合 Redisson 分布式锁实现幂等消费,提供详细的代码示例和实践建议…

无服务器日志分析由 Elasticsearch 提供支持,推出新的低价层

作者:来自 Elastic Log Analytics Elastic Observability Logs Essentials 在 Elastic Cloud Serverless 上提供成本效益高、无麻烦的日志分析。 SREs 可以摄取、搜索、丰富、分析、存储和处理日志,而无需管理部署的运营开销。[](https://www.elastic.co…

(Arxiv-2025)Phantom-Data:迈向通用的主体一致性视频生成数据集

Phantom-Data:迈向通用的主体一致性视频生成数据集 paper是字节发布在Arxiv2025的工作 paper title:Phantom-Data: Towards a General Subject-Consistent Video Generation Dataset Code:链接 Abstract 近年来,主体到视频&#…

如何解决pip安装报错ModuleNotFoundError: No module named ‘mlflow’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘mlflow’问题 摘要 在Python开发中,pip install 报错是一种常见问题,尤其是在使用集成开发环境(IDE)如PyCharm时…

2020/12 JLPT听力原文 问题一 3番

3番:会社で女の人と男の人が話しています。女の人は倉庫に入るとき、どの順番で入口のボタンを押さなければなりませんか。 女:すみません。地下の倉庫に行って、資料を取ってきたいんですが、入口の開け方がわからなくて… 男:ああ、最近、管…

C#/.NET/.NET Core技术前沿周刊 | 第 49 期(2025年8.1-8.10)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…

基于强化学习的目标跟踪 研究初探

强化学习 目标跟踪Visual tracking by means of deep reinforcement learning and an expert demonstratorYOLO 检测下基于 ETC-DDPG 算法的无人机视觉跟踪基于特征与深度强化学习方法的机器人视觉伺服技术研究高性能可拓展视频目标跟踪算法研究基于目标运动与外观特征的多目标…

排序与查找,简略版

数组的排序 排序的基本介绍 排序是将一组数据,按照一定顺序进行排列的过程 排序的分类: 内部排序: 一次性适用数据量小的情况 将需要处理的数据都加载到内部存储器中进行排序。包括交换式排序,选择式排序,插入式排序 外…

打靶日常-XSS(反射型和存储型)

目录 小皮: 1. 2.这里需要登录,我们之前爆破出账号密码在这里就可以用​编辑 登录之后:​编辑 使用工具: 先输入正确字符进行测试:aaa 进行测试: 3.换种控制台显示 结果:(使用f12大法) DVWA: 反射型XSS: 低: ​编辑 中:大小写绕过: ​编辑 也可以双写绕过: ​编…

二叉搜索树深度解析:从原理实现到算法应用----《Hello C++ Wrold!》(18)--(C/C++)

文章目录前言二叉搜索树(二叉排序树或二叉查找树)二叉搜索树的模拟实现二叉搜索树和有序数组二分查找的比较两个搜索模型作业部分前言 二叉搜索树(Binary Search Tree,简称 BST)作为一种重要的树形数据结构&#xff0…

牛客.空调遥控二分查找牛客.kotori和气球(数学问题)力扣.二叉树的最大路径和牛客.主持人调度(二)

目录 牛客.空调遥控 二分查找 牛客.kotori和气球(数学问题) 力扣.二叉树的最大路径和 牛客.主持人调度(二) 牛客.空调遥控 枚举n个空调之后,使数组有序,左右下标,用二分查找,然后一个求 长度就好 二分查找 /二分理…

《嵌入式Linux应用编程(二):标准IO高级操作与文件流定位实战》

今日学习内容1. 行输入函数安全实践(1) fgets vs gets函数安全特性换行符处理缓冲区保护fgets指定读取长度(size-1)保留\n并添加\0安全(防溢出)gets无长度限制将\n替换为\0危险2. Linux标准文件流文件流符号设备 标准输入stdin键盘…

Springboot2+vue2+uniapp 小程序端实现搜索联想自动补全功能

目录 一、实现目标 1.1 需求 1.2 实现示例图: 二、实现步骤 2.1 实现方法简述 2.2 简单科普 2.3 实现步骤及代码 一、实现目标 1.1 需求 搜索联想——自动补全 (1)实现搜索输入框,用户输入时能显示模糊匹配结果 &am…

极简 5 步:Ubuntu+RTX4090 源码编译 vLLM

极简 5 步:UbuntuRTX4090 源码编译 vLLM1. 系统依赖(一次性)2. 进入源码目录 & 激活环境3. 启用 ccache 自动并行度4. 拉代码 编译(2 行搞定)5. 更新 flash-attn(与 vLLM 配套)6. 启动 4 …