缓存三剑客解决方案

1.缓存雪崩

定义: 大量缓存数据在同一时间点集体失效,导致所有请求直接穿透到数据库,引发数据库瞬时高负载甚至崩溃。

解决方案: 设置过期随机值,避免大量缓存同时失效。

// 缓存雪崩防护:随机过期时间 + 双层缓存// 设置随机过期时间(基础时间 + 随机偏移)Random random = new Random();long expire = baseExpire + random.nextInt(5 * 60 * 1000); // 基础5分钟 + 随机5分钟内data = loader.load();setCache(key, data, expire);setCache(backupKey, data, expire * 2); // 备份缓存过期时间更长return data;
}

2. 缓存击穿解决方案

定义: 某个热点Key突然失效(如过期或被删除),同时有大量并发请求访问该Key,导致请求全部发到数据库。

方案1:互斥锁(分布式锁)
在这里插入图片描述

  @Nullable// todo 3、缓存击穿 -> 互斥锁:只能由一个线程进行缓存构建,其他线程等待,吞吐量较低private Shop huchi(Long id) {String shopJsonStr = stringRedisTemplate.opsForValue().get("cache:shop:" + id);if (StrUtil.isNotBlank(shopJsonStr)) {return JSONUtil.toBean(shopJsonStr, Shop.class);}// 未命中获取锁String tryLockKey = "cache:shop:lock:" + id;Shop shop = null;try {boolean tryLock = getLock(tryLockKey);// 未命中:不断休眠直至获取成功while (!tryLock) {Thread.sleep(50);tryLock = getLock(tryLockKey);}// 获取互斥锁,进行缓存的构建shop = getById(id);if (shop == null) {// 数据库中也不存在时候,进行空字符串缓存stringRedisTemplate.opsForValue().set("cache:shop:" + id, "", 2, TimeUnit.MINUTES);return null;}stringRedisTemplate.opsForValue().set("cache:shop:" + id, JSONUtil.toJsonStr(shop), 2, TimeUnit.MINUTES);} catch (Exception e) {e.getStackTrace();} finally {unLock(tryLockKey);}return shop;}

方案2:逻辑过期(适合高并发读场景)

在这里插入图片描述

@Nullable// todo 3、缓存击穿 -> 逻辑过期:通过设置逻辑过期时间,然后判断是否过期来确定是否进行缓存更新private Shop exLogical(Long id) {ExecutorService executorService = Executors.newFixedThreadPool(10);String shopJsonStr = stringRedisTemplate.opsForValue().get("cache:shop:" + id);// 如果不存在那就是一定不存在if (StrUtil.isBlank(shopJsonStr)) {return null;}//RedisDate redisDate = JSONUtil.toBean(shopJsonStr, RedisDate.class);Shop shop = JSONUtil.toBean((JSONObject) redisDate.getObject(), Shop.class);// 未逻辑过期if (redisDate.getEx().isAfter(LocalDateTime.now())) {return shop;}// 逻辑过期//  缓存重建String tryLockKey = "cache:shop:lock:" + id;boolean tryLock = getLock(tryLockKey);if (tryLock) {// 开启独立的线程去独立的进行缓存executorService.submit(() -> {try {this.saveShopRedis(id, 20L);} finally {unLock(tryLockKey);}});}return shop;}// 手动设置逻辑过期时间private void saveShopRedis(Long id, Long ex) {Shop shop = getById(id);RedisDate redisDate = new RedisDate();redisDate.setEx(LocalDateTime.now().plusSeconds(ex));redisDate.setObject(shop);stringRedisTemplate.opsForValue().set("cache:shop:" + id, JSONUtil.toJsonStr(redisDate));}

方案2:布隆过滤器

觉得有帮助的话,点个赞或关注再走呗。
本人水平有限,有错的地方还请批评指正。

什么是精神内耗?
简单地说,就是心理戏太多,自己消耗自己。
所谓:
言未出,结局已演千百遍;
身未动,心中已过万重山;
行未果,假想灾难愁不展;
事已闭,过往仍在脑中演。

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

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

相关文章

HTML 页面禁止缩放功能

页面禁止缩放 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1, shrink-to-fitno, maximum-scale1.0, us…

在github上搭建自己主页

主要是这篇博客进行一些补充。 第一步照做就行 首先是第二步 克隆仓库到本地 先下载一个git&#xff0c;电脑创建一个新文件夹&#xff0c;然后 git clone xxxxx 注意即使你使用了代理&#xff0c;这里大概率也会报错&#xff0c;Failed to connect to github.com port 443 …

Laravel 框架NOAUTH Authentication required 错误解决方案-优雅草卓伊凡

Laravel 框架NOAUTH Authentication required 错误解决方案-优雅草卓伊凡NOAUTH Authentication required 错误这个错误通常出现在以下几种情况&#xff1a;Redis 认证问题&#xff1a;如果你的应用使用了 Redis 且配置了密码API 认证问题&#xff1a;请求需要认证的 API 端点但…

kafka生产端和消费端的僵尸实例以及解决办法

目录 一 生产端僵尸 1.1 原因 1.2 问题 1.3解决办法 1.4 案例 1.4.1 案例1&#xff1a;生产者崩溃后重启 (同一 transactional.id) 1.4.2 案例2&#xff1a;短暂网络分区导致的脑裂 1.4.3 案例3&#xff1a;正确 - 解决僵尸 1.4.4 案例4&#xff1a;错误 - 无法解决僵…

国产电科金仓数据库金仓KES V9 2025:AI时代的数据库融合标杆

国产电科金仓数据库金仓KES V9 2025&#xff1a;AI时代的数据库融合标杆 在AI技术迅猛发展的今天&#xff0c;企业数据管理面临着前所未有的挑战&#xff1a;异构数据库兼容难题、多数据模型融合需求、高并发场景性能瓶颈、跨中心容灾压力……这些痛点如同数据流转的大问题&am…

【STM32】关于STM32F407写Flash失败问题的解决办法

问题描述 在使用正点原子的STM32F407写flash例程时&#xff0c;发现STMFLASH_Write函数没办法写入数据到flash&#xff0c;原始代码输入下&#xff1a; 随后对每一行代码的结果进行分析&#xff0c;发现87行的“FLASH_ProgramWord(WriteAddr,*pBuffer)”返回值是7&#xff0c;一…

CUDA与RISC-V的融合:打破架构霸权,重塑AI计算未来

当x86和Arm统治数据中心十余年后,一家GPU巨头正悄悄将十亿颗RISC-V核心嵌入其系统。如今,它决定拆除CPU架构的围墙。 2025年7月,上海张江科学会堂。英伟达硬件工程副总裁Frans Sijstermanns在第五届RISC-V中国峰会上宣布:英伟达正式启动CUDA向RISC-V架构的移植工作。 这个…

微信二维码扫描登录流程详解

二维码扫描登录流程细节&#xff08;项目经验&#xff09; 1&#xff1a; 获取二维码信息 PC会优先存放服务器生成的唯一密钥&#xff1a; 比如 source、secret 以密文形式存储大致发送字段&#xff1a; sourcesecretmac(mac 地址) 服务器生成 二维码信息&#xff1a;二维码字符…

日本上市IT企业|8月125日将在大连举办赴日it招聘会

株式会社GSD的核心战略伙伴贝斯株式会社&#xff0c;将于2025年8月25日在大连香格里拉大酒店商务会议室隆重举办赴日技术人才专场招聘会。本次招聘会面向全国范围内的优秀IT人才&#xff0c;旨在为贝斯株式会社东京本社长期发展招募优质的系统开发与管理人才。招聘计划&#xf…

Python 数据分析与可视化:从基础到进阶的技术实现与优化策略

数据分析与可视化是数据科学领域的核心技能,Python 凭借其丰富的库生态和灵活的编程范式,成为该领域的首选工具。本文将系统讲解 Python 数据分析与可视化的技术栈实现,从基础操作到性能优化,结合实战场景提供可复用的解决方案。 数据分析核心库技术解析 Pandas 数据处理…

Rust Web 全栈开发(十):编写服务器端 Web 应用

Rust Web 全栈开发&#xff08;十&#xff09;&#xff1a;编写服务器端 Web 应用Rust Web 全栈开发&#xff08;十&#xff09;&#xff1a;编写服务器端 Web 应用创建成员库&#xff1a;webappmodelshandlersrouterserrorsmodsvrstaticteachers.htmlregister.htmlbootstrap.m…

每日面试题11:JVM

深入理解JVM&#xff1a;Java的“心脏”如何驱动程序运行&#xff1f;为什么需要JVM&#xff1f;你是否想过&#xff0c;为什么用Java写的程序&#xff0c;能在Windows、Linux、macOS上“无缝运行”&#xff1f;为什么开发者无需为不同操作系统重写代码&#xff1f;这背后的核心…

Linux网络信息(含ssh服务和rsync)

73.telnet&#xff1a;测试端口连通性用法&#xff1a;telnet 主机名或IP 端口号测试目标主机的指定端口是否开放&#xff0c;检查网络服务连通性。eg&#xff1a;telnet www.baidu.com 80# 说明&#xff1a;# - 如果连接成功&#xff0c;显示 "Connected to ..."。…

【PTA数据结构 | C语言版】我爱背单词

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 作为一个勤奋的学生&#xff0c;你在阅读一段英文文章时&#xff0c;是否希望有个程序能自动帮你把没有背过的生词列出来&#xff1f;本题就请你实现这个程序。 输入格式&#xff1a; 输入第 1 行给…

如何使用电脑连接小米耳机(红米 redmi耳机)

如何使用电脑连接小米&#xff08;红米 redmi&#xff09;耳机Redmi耳机连接电脑的具体步骤如下注意事项和常见问题解决方法&#xff1a;Redmi耳机连接电脑的具体步骤如下 打开耳机仓盖&#xff1a; 首先&#xff0c;打开Redmi耳机的充电仓盖&#xff0c;但不需要取出耳机。进…

排序算法—交换排序(冒泡、快速)(动图演示)

目录 十大排序算法分类​编辑 冒泡排序 算法步骤&#xff1a; 动图演示&#xff1a; 性能分析&#xff1a; 代码实现&#xff08;Java&#xff09;&#xff1a; 快速排序&#xff08;挖坑法&#xff09; 算法步骤&#xff1a; 动图演示&#xff1a; 性能分析&#xff1…

2023 年 5 月青少年软编等考 C 语言八级真题解析

目录 T1. 道路 思路分析 T2. Rainbow 的商店 思路分析 T3. 冰阔落 I 思路分析 T4. 青蛙的约会 思路分析 T1. 道路 题目链接:SOJ D1216 N N N 个以 1 ∼ N 1 \sim N 1∼N 标号的城市通过单向的道路相连,每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数…

【vue-4】深入理解 Vue 3 中的 v-for 指令

Vue.js 作为现代前端框架的代表之一&#xff0c;其模板指令系统提供了强大的数据绑定和渲染能力。其中&#xff0c;v-for 指令是 Vue 中最常用且最重要的指令之一&#xff0c;它允许我们基于数据源循环渲染元素或组件。在 Vue 3 中&#xff0c;v-for 保留了一贯的简洁语法&…

《R for Data Science (2e)》免费中文翻译 (第1章) --- Data visualization(1)

写在前面 本系列推文为《R for Data Science (2)》的中文翻译版本。所有内容都通过开源免费的方式上传至Github&#xff0c;欢迎大家参与贡献&#xff0c;详细信息见&#xff1a; Books-zh-cn 项目介绍&#xff1a; Books-zh-cn&#xff1a;开源免费的中文书籍社区 r4ds-zh-cn …

界面组件DevExpress WPF中文教程:Grid - 如何完成节点排序和移动?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…