当前位置: 首页 > news >正文

缓存三大问题及其解决方案

缓存三大问题及其解决方案

1. 前言

​ 在现代系统架构中,缓存与数据库的结合使用是一种经典的设计模式。为了确保缓存中的数据与数据库中的数据保持一致,通常会给缓存数据设置一个过期时间。当系统接收到用户请求时,首先会访问缓存。如果缓存中不存在所需数据,系统会进一步查询数据库,并将获取到的数据回写到缓存中。这样,当系统再次接收到相同的请求时,便可以直接从缓存中获取数据并返回给用户,从而提升系统的响应速度和性能。

缓存与数据库交互示意图

2. 缓存穿透

​ 在上述系统架构中,当用户从缓存中获取数据时,如果缓存中不存在该数据,系统会转而查询数据库。然而,如果数据库中也不存在该数据,系统将无法将数据回写到缓存中。这导致后续相同的请求仍然会直接访问数据库。如果短时间内系统接收到大量此类请求,数据库的压力将急剧增加,甚至可能导致数据库服务器宕机。

缓存穿透示意图

2.1 解决方案
  1. 限制非法请求

    ​ 缓存穿透问题往往是由于恶意攻击(如黑客攻击)导致的。因此,我们可以在API入口处对请求的合法性进行检测。例如,可以检查请求的IP地址、参数和字段的合法性。如果请求被判定为非法,系统可以直接返回错误响应,而无需进一步访问缓存或数据库。

  2. 缓存空值或默认值

    ​ 当请求的数据在缓存和数据库中均不存在时,系统可以将该数据的键值对缓存起来,并将其值设置为空或赋予一个默认值。这样,当系统再次接收到相同的请求时,便可以直接从缓存中获取数据并返回,从而避免了对数据库的重复查询。

  3. 使用布隆过滤器

    ​ 布隆过滤器是一种高效的数据结构,用于判断某个元素是否存在于集合中。我们可以在写入数据库数据时,同步将该数据的标识存入布隆过滤器中。当系统接收到用户请求时,如果缓存中不存在该数据,系统可以先查询布隆过滤器。如果布隆过滤器中也不存在该数据,系统可以直接返回,而无需访问数据库。这种方法能够有效减少数据库的查询压力,尤其是在面对大量请求时。

3. 缓存雪崩

​ 通常情况下,缓存中的数据会设置一个过期时间,以便及时更新数据,确保与数据库中的数据保持一致。然而,如果大量缓存在同一时间过期,系统将无法从缓存中获取数据,导致大量请求直接涌入数据库。这种情况下,数据库的压力将急剧增加,甚至可能导致数据库崩溃。

缓存雪崩示意图

3.1 解决方案
  1. 均匀设置过期时间

    ​ 为了避免大量缓存在同一时间过期,可以为缓存数据设置随机的过期时间。通过均匀分布缓存的过期时间,可以有效避免缓存同时失效,从而减轻数据库的压力。

  2. 使用互斥锁

    ​ 当系统接收到用户请求时,如果请求的数据不在缓存中,系统可以为该请求加一个互斥锁,确保同一时间内只有一个请求能够访问数据库。当数据库中的数据被成功查询并回写到缓存后,系统再释放该锁。其他请求在缓存中获取不到数据时,可以选择等待锁释放或直接返回空值或默认值。

    ​ 需要注意的是,互斥锁应设置一个合理的过期时间,以防止因异常情况导致锁无法释放。

  3. 后台线程更新缓存

    ​ 当系统接收到用户请求时,如果请求的数据不在缓存中,系统可以调用后台线程或通过消息队列触发后台线程来更新缓存。后台线程会首先检查缓存中是否存在该数据,如果存在则不执行更新操作;如果不存在,则从数据库中获取数据并回写到缓存中。

    ​ 在系统刚上线时,可以通过手动调用后台线程,将部分热点数据预先加载到缓存中,以避免冷启动时的大量数据库查询。

4. 缓存击穿

​ 在秒杀等高频访问场景中,某些热点数据会被频繁访问。如果这些热点数据恰好过期,大量请求将无法从缓存中获取数据,转而直接访问数据库。这种情况下,数据库的压力将急剧增加,甚至可能导致数据库崩溃。

缓存击穿示意图

4.1 解决方案

​ 缓存击穿可以视为缓存雪崩的一种特殊情况,因此其解决方案与缓存雪崩类似。

  1. 使用互斥锁

    ​ 当系统在缓存中无法获取到数据时,可以为该请求加一个互斥锁,并设置合理的过期时间。这样可以确保同一时间内只有一个请求能够访问数据库,从而避免大量请求同时涌入数据库。

  2. 后台线程更新缓存

    ​ 当系统在缓存中无法获取到数据时,可以调用后台线程来更新缓存。后台线程会从数据库中获取数据并回写到缓存中。在系统刚上线时,可以通过预热机制将部分热点数据预先加载到缓存中,以避免缓存击穿问题。

5. 总结

​ 缓存穿透、缓存雪崩和缓存击穿是缓存系统中常见的三大问题。通过合理设置缓存过期时间、使用互斥锁、布隆过滤器以及后台线程更新缓存等策略,可以有效缓解这些问题,提升系统的稳定性和性能。在实际应用中,应根据具体业务场景选择合适的解决方案,以确保系统的高效运行。

相关文章:

缓存三大问题及其解决方案

缓存三大问题及其解决方案 1. 前言 ​ 在现代系统架构中,缓存与数据库的结合使用是一种经典的设计模式。为了确保缓存中的数据与数据库中的数据保持一致,通常会给缓存数据设置一个过期时间。当系统接收到用户请求时,首先会访问缓存。如果缓…...

大语言模型常用微调与基于SFT微调DeepSeek R1指南

概述 大型语言模型(LLM,Large Language Model)的微调(Fine-tuning)是指在一个预训练模型的基础上,使用特定领域或任务的数据对模型进行进一步训练,以使其在该领域或任务上表现更好。微调是迁移…...

LabVIEW的吞雨测控系统

本案例介绍了一种基于LabVIEW开发的吞雨测控系统,该系统通过建模仿真分析不同控制器模式下的阶跃信号响应,从而选择了最适合的控制器。为了有效解决在控制流量过程中出现的振荡收敛和流量信号大扰动问题,系统采用了改进的积分分离PID算法&…...

redis基础命令

基于内存的数据存储系统 redis中数据以键值对存储的 键区分大小写 redis默认都是使用字符串存储数据 //启动服务 redis-server //连接客户端 redis-cli //连接客户端,--raw表示以原始的形式显示内容 redis-cli --rawset keyname valueget keynamedel keyname //…...

基于Java+SpringBoot+Vue的前后端分离的校园闲置物品交易网站

基于JavaSpringBootVue的前后端分离的校园闲置物品交易网站 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接…...

K8s 证书认知(K8s Certificate Awareness)

K8s 证书认知 在谈起 Kubernetes 证书时,总感觉其涵盖的内容繁多,仿佛千头万绪,让人不知该从何处着手阐述。为了更好地理清思路,本文将对相关内容进行系统的梳理和记录。 1、证书及链路关系 Kubeadm部署的集群,K8s …...

前x-ai首席科学家karpathy的从零构建ChatGPT视频学习笔记--8000字长图文笔记预警(手打纯干货,通俗易懂)

2025.2.17晚上21:57看完了整个视频,作为一个ai专业的学生虽然每天都在用ai,但是对于其背后的原理却不是那么清楚,而卡帕西的这支视频却让我醍醐灌顶,而且全程听起来很舒服,没有知识强行进入脑子的痛感,在他…...

【智慧校园】分体空调节能监管:打造高效节能的学习环境

随着科技的飞速发展和生活品质的不断提升,人们对于家居和办公环境的舒适度与智能化要求也越来越高。分体空调集中控制系统作为一种先进的空调管理方式,正逐渐成为现代家庭和办公场所的标配,为用户带来更加便捷、高效和节能的空调使用体验。随…...

深度学习-1.简介

Deep Learning - Lecture 1 Introduction to Deep Learning 学习深度学习的动机什么是深度学习什么导致了深度学习的出现模型与理论的发展(软件部分)通用图形处理单元GPU的发展(硬件部分)CPU与GPU计算对比 GPU与CPU的理论FLOPS对…...

【Rust中级教程】1.10. 引用及内部可变性(简单回顾):引用、内部可变性、`Cell`类型及相关操作

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 这篇文章只对所有权进行简单回顾,想要看完整的所有权系统阐述见【Rust自学】专栏…...

Docker 安装和配置 Nginx 详细图文教程

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...

基于Java+Swing+Mysql实现旅游管理信息系统

基于JavaSwingMysql实现旅游管理信息系统 一、系统介绍二、功能展示1.登陆2.注册3.旅游信息查询4.查看游行团信息5.报名6、报名信息管理 三、数据库四、其它1.其他系统实现五.获取源码 一、系统介绍 用户:登陆、注册、旅游信息查询、查看游行团信息、报名 管理员&a…...

使用 Openpyxl 操作 Excel 文件详解

文章目录 安装安装Python3安装 openpyxl 基础操作1. 引入2. 创建工作簿和工作表3. 写入数据4. 保存工作簿5. 加载已存在的Excel6. 读取单元格的值7. 选择工作表 样式和格式化1. 引入2. 设置字体3. 设置边框4. 填充5. 设置数字格式6. 数据验证7. 公式操作 性能优化1. read_only/…...

统信服务器操作系统V20 1070A 安装docker新版本26.1.4

应用场景: 硬件/整机信息:x86平台、深信服超融合平台 OS版本信息:统信V20 1070a 1.获取docker二进制包 链接: https://pan.baidu.com/s/1SukBlra0mQxvslTfFakzGw?pwd5s5y 提取码: 5s5y tar xvf docker-26.1.4.tgz groupadd docker ch…...

【数据分享】1929-2024年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2024年全球气象站…...

python爬虫系列课程1:初识爬虫

python爬虫系列课程1:初识爬虫 一、爬虫的概念二、通用爬虫和自定义爬虫的区别三、开发语言四、爬虫流程一、爬虫的概念 网络爬虫(又被称为网页蜘蛛、网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动抓取互联网信息的程序。原则上,只要是…...

大模型工具大比拼:SGLang、Ollama、VLLM、LLaMA.cpp 如何选择?

简介:在人工智能飞速发展的今天,大模型已经成为推动技术革新的核心力量。无论是智能客服、内容创作,还是科研辅助、代码生成,大模型的身影无处不在。然而,面对市场上琳琅满目的工具,如何挑选最适合自己的那…...

什么是语料清洗、预训练、指令微调、强化学习、内容安全; 什么是megatron,deepspeed,vllm推理加速框架

什么是语料清洗、预训练、指令微调、强化学习、内容安全 目录 什么是语料清洗、预训练、指令微调、强化学习、内容安全语料清洗预训练指令微调强化学习内容安全什么是megatron,deepspeed,vllm推理加速框架语料清洗 语料清洗是对原始文本数据进行处理的过程,旨在去除数据中的…...

HTTP的“对话”逻辑:请求与响应如何构建数据桥梁?

一、前言 作为现代互联网通信的基石,HTTP协议定义了客户端与服务器之间的“对话规则”。每一次网页加载、API调用或文件传输的背后,都离不开精心构造的HTTP请求与响应。请求中封装了用户的意图——从请求方法、资源路径到提交的数据;响应则承…...

【深度学习】预训练和微调概述

预训练和微调概述 1. 预训练和微调的介绍1.1 预训练(Pretraining)1.2 微调(Fine-Tuning) 2. 预训练和微调的区别 预训练和微调是现代深度学习模型训练中的两个关键步骤,它们通常是一个 预训练-微调 (Pretrain-Finetune…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...