缓存使用的具体场景有哪些?缓存的一致性问题如何解决?缓存使用常见问题有哪些?


缓存使用场景、一致性及常见问题解析


一、缓存的核心使用场景
1. 高频读、低频写场景
  • 典型场景:商品详情页、新闻资讯、用户基本信息。
  • 特点:数据更新频率低,但访问量极高。
  • 策略
    • Cache-Aside(旁路缓存):优先读缓存,未命中时查数据库并回填。
    • TTL(过期时间):设置合理过期时间(如5分钟),平衡数据新鲜度与缓存命中率。

示例

public Product getProduct(String id) {Product product = cache.get(id);if (product == null) {product = db.query("SELECT * FROM product WHERE id = ?", id);cache.set(id, product, 300); // 缓存5分钟}return product;
}
2. 热点数据加速
  • 典型场景:微博热搜、秒杀活动倒计时、直播在线人数。
  • 特点:短时间内流量突增,需快速响应。
  • 策略
    • 本地缓存 + 分布式缓存:如Guava Cache + Redis,减少网络开销。
    • Key分片:将热点Key分散到多个节点(如hot:item:123hot:item:123_{shardId})。
3. 复杂计算缓存
  • 典型场景:排行榜、聚合统计结果(如用户总积分)。
  • 特点:计算成本高,结果可复用。
  • 策略
    • 预计算+定时更新:定时任务生成结果并缓存。
    • Write-Through(直写):数据变更时同步更新缓存。
4. 会话与状态管理
  • 典型场景:用户登录状态、购物车信息。
  • 特点:临时性数据,读写频繁。
  • 策略
    • Redis Session存储:集中管理会话,支持分布式扩展。
    • TTL自动清理:设置会话过期时间(如30分钟)。

二、缓存一致性问题及解决方案
1. 一致性问题的根源
  • 数据源多副本:缓存与数据库存在两份数据。
  • 并发操作:多线程/多节点同时修改数据。
  • 网络延迟:缓存与数据库更新不同步。
2. 典型场景与解决方案
场景问题描述解决方案
先更新数据库,后删缓存删除缓存失败,后续请求读到旧数据。延迟双删:更新数据库 → 删除缓存 → 延迟几百毫秒再删一次。
先删缓存,后更新数据库删缓存后、更新数据库前,其他请求可能读到旧值并回填缓存。异步重试:删除缓存后,通过消息队列确保数据库更新成功,否则重试删除操作。
并发写导致覆盖多个线程同时更新同一数据,缓存与数据库不一致。分布式锁:更新时加锁(如Redis SETNX),串行化操作。

示例:延迟双删伪代码

public void updateProduct(Product product) {// 1. 更新数据库db.update(product);// 2. 删除缓存cache.delete(product.getId());// 3. 延迟再次删除(应对并发场景)executor.schedule(() -> cache.delete(product.getId()), 500, TimeUnit.MILLISECONDS);
}
3. 最终一致性方案
  • Binlog监听:通过Canal监听数据库变更,异步更新缓存。
  • 消息队列:数据库变更后发送MQ消息,消费者更新缓存。

三、缓存常见问题与应对策略
1. 缓存穿透(Cache Penetration)
  • 问题:大量请求查询不存在的数据(如无效ID),绕过缓存直接访问数据库。
  • 解决
    • 布隆过滤器(Bloom Filter):预存所有合法Key,拦截非法请求。
    • 缓存空值:对不存在的数据缓存NULL并设置短TTL(如30秒)。

示例

public Product getProduct(String id) {Product product = cache.get(id);if (product != null) {return product;}if (bloomFilter.mightContain(id)) { // 布隆过滤器检查product = db.query("SELECT * FROM product WHERE id = ?", id);if (product != null) {cache.set(id, product, 300);} else {cache.set(id, NULL, 30); // 缓存空值}}return product;
}
2. 缓存雪崩(Cache Avalanche)
  • 问题:大量缓存同时失效,请求直接冲击数据库。
  • 解决
    • 随机过期时间:在基础TTL上增加随机值(如TTL + random(0, 300))。
    • 热点数据永不过期:后台定时异步更新缓存。
3. 缓存击穿(Cache Breakdown)
  • 问题:热点Key过期瞬间,大量并发请求直达数据库。
  • 解决
    • 互斥锁(Mutex Lock):第一个请求重建缓存时加锁,其他请求等待。
    • 逻辑过期:缓存Value包含逻辑过期时间,异步刷新。

示例:互斥锁实现

public Product getProduct(String id) {Product product = cache.get(id);if (product == null) {Lock lock = redisLock.lock(id); // 获取分布式锁try {product = cache.get(id); // 双重检查if (product == null) {product = db.query("SELECT * FROM product WHERE id = ?", id);cache.set(id, product, 300);}} finally {redisLock.unlock(id);}}return product;
}
4. 数据漂移(Hot Key 不均)
  • 问题:某个节点缓存过多热点Key,导致负载不均。
  • 解决
    • 本地缓存:在应用层缓存热点数据,减少访问分布式缓存。
    • Key分片:将热点Key分散到多个节点(如product:123product:123_{shardId})。

四、缓存策略选择
策略适用场景优点缺点
Cache-Aside通用场景,需强一致性控制灵活,缓存与数据库解耦需处理一致性问题
Read-Through缓存作为主要数据源简化代码,自动加载数据缓存层需支持加载逻辑
Write-Through写操作频繁且需强一致性数据更新实时同步写延迟较高
Write-Behind高吞吐写场景(如日志记录)写性能高,批量更新数据库数据可能丢失(未持久化前宕机)

🐮🐎

  • 使用场景:缓存适用于读多写少、热点数据、复杂计算等场景,显著提升系统性能。
  • 一致性问题:通过延迟双删、异步消息、分布式锁等方案平衡性能与一致性。
  • 常见问题:穿透、雪崩、击穿需针对性设计防御策略(布隆过滤器、随机TTL、互斥锁)。
    合理选择缓存策略,结合监控与动态调优,可最大化缓存收益并规避潜在风险。

在这里插入图片描述

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

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

相关文章

HTML5(Web前端开发笔记第一期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解 目录 三件套标签标题标签段落标签文本格式化标签图像标签超链接标签锚点链接默认链接地址 音频标签视频标签 HTML基本骨架综合案例->个人简介列表表格表单input标签单选框radio上传…

ubuntu22.04 关于挂在设备为nfts文件格式无法创建软连接的问题

最近遇到情况,解压工程报错,无法创建软连接 但是盘内还有130G空间,明显不是空间问题,查找之后发现是移动硬盘的文件格式是NTFS,在ubuntu上不好兼容,于是报错。 开贴记录解决方案。 1.确定文件格式 使用命…

深度解读DeepSeek部署使用安全(48页PPT)(文末有下载方式)

深度解读DeepSeek:部署、使用与安全 详细资料请看本解读文章的最后内容。 引言 DeepSeek作为一款先进的人工智能模型,其部署、使用与安全性是用户最为关注的三大核心问题。本文将从本地化部署、使用方法与技巧、以及安全性三个方面,对Deep…

RK3568 Android13 源码编译

提示:RK3568 Android13 源码编译 脚本,源码编译管理方式优化 文章目录 获取源码设置屏幕配置确认屏幕修改源码的设备树 修改线程数整体编译Android固件配置JDK java 环境 source javaenv.sh使能编译 build/envsetup.sh lunch topeet_rk3568-userdebug整体…

【CentOS】搭建Radius服务器

目录 背景简介:Radius是什么?Radius服务器验证原理搭建Radius服务器环境信息yum在线安装配置FreeRADIUS相关文件clients.conf文件users文件重启服务 验证 参考链接 背景 在项目中需要用到Radius服务器作为数据库代理用户的外部验证服务器,做…

ToB公司找客户专用|大数据获客系统

对于ToB公司而言,找到并吸引合适的潜在客户并非易事。传统的获客手段如参加行业展会、电话推销以及直接拜访等,虽然在过去取得了一定成效,但如今却暴露出诸多问题。首先,这些方法往往成本高昂,无论是时间还是金钱上的投…

Linux 文件权限类

目录 文件属性 从左到右的10个字符表示 rwx作用文件和目录的不同解释 图标: 案例实操 chmod 改变权限 基本语法 经验技巧 案例实操 拓展:可以通过一个命令查看用户列表 chown改变所有者 基本语法 选项说明 案例实操 chgrp 改变所属组 基…

DeepSeek技术解析:MoE架构实现与代码实战

以下是一篇结合DeepSeek技术解析与代码示例的技术文章,重点展示其核心算法实现与落地应用: DeepSeek技术解析:MoE架构实现与代码实战 作为中国AI领域的创新代表,DeepSeek在混合专家模型(Mixture of Experts, MoE&…

vue3:八、登录界面实现-页面初始搭建、基础实现

一、初始工作 1、创建登录文件 在src/views中创建文件LoginView.vue文件 2、创建路由 在router/index.js中增加登录的信息 代码 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue const router createRouter({hist…

dify+mysql的诗词助手

目录 数据库表结构: 数据库查询的http服务搭建: 流程引擎搭建: 开始, HTTP查询数据库, LLM数据分析, 直接回复, 效果测试: 下载链接: 数据库表结构:…

jenkins 配置邮件问题整理

版本:Jenkins 2.492.1 插件: A.jenkins自带的, B.安装功能强大的插件 配置流程: 1. jenkins->系统配置->Jenkins Location 此处的”系统管理员邮件地址“,是配置之后发件人的email。 2.配置系统自带的邮件A…

谷歌Chrome或微软Edge浏览器修改网页任意内容

在谷歌或微软浏览器按F12,打开开发者工具,切换到console选项卡: 在下面的输入行输入下面的命令回车: document.body.contentEditable"true"效果如下:

blender使用初体验(甜甜圈教程)

使用blender 建模了甜甜圈,时间空闲了,但愿能创建点好玩的吸引人的东西

Adobe Firefly 技术浅析(三):GANs 的改进

生成式对抗网络(GANs)在图像生成领域取得了显著的进展,但原始的 GANs 在训练稳定性、生成质量以及多样性方面存在一些挑战。Adobe Firefly 在其图像生成技术中采用了多种改进的 GANs 方法,以提高生成图像的质量和多样性。 1. 条件生成式对抗网络(cGANs) 1.1 基本原理 …

go GRPC学习笔记

本博文源于笔者正在学习的gprc,相关配套书籍素材来源是《Go编程进阶实战》,博文内容主要包含了RPC模式讲解,RPC通过htttp访问、拦截器、提高服务端与客户端容错的内容配置 在此之前需要下载protoc,这里不做下载过程 1、RPC模式 …

CentOS 系统安装 docker 以及常用插件

博主用的的是WindTerm软件链接的服务器,因为好用 1.链接上服务器登入后,在/root/目录下 2.执行以下命令安装docker sudo yum install -y yum-utilssudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.reposudo…

MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。

2025-03-13,由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架,通过合成自挑战问题来增强视觉-语言模型(VLMs)的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练,显著提升了模型在推理深度和广度上的表…

论文阅读笔记——LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

LoRA 论文 传统全面微调&#xff0c;对每个任务学习的参数与原始模型相同&#xff1a; m a x Φ ∑ ( x , y ) ∈ Z ∑ t 1 ∣ y ∣ l o g ( P Φ ( y t ∣ x , y < t ) ) 式(1) max_{\Phi}\sum_{(x,y)\in Z}\sum^{|y|}_{t1}log(P_{\Phi}(y_t|x,y<t)) \qquad \text{式(…

Umi-OCR 全家桶

介绍&#xff1a; 下载 访问官网地址 https://github.com/hiroi-sora/umi-ocrhttps://github.com/hiroi-sora/umi-ocr 点击下载&#xff08;.exe 文件 安装即可&#xff09; 桌面使用 安装完毕后去安装路径下点击 Umi-OCR.exe &#xff08;默认不会生成桌面的快捷方式&…

oracle中OS BLOCK的含义

在Oracle数据库中&#xff0c;OS BLOCK&#xff08;操作系统数据块&#xff09;是指操作系统层面上的数据块&#xff0c;它与Oracle数据库内部的逻辑存储单元BLOCK&#xff08;数据块&#xff09;有所区别但密切相关。以下是对OS BLOCK的详细解释&#xff1a; 定义与概念 OS BL…