day102-缓存-缓存使用-加锁解决缓存击穿问题以及加锁位置的重要性

【信息科学与工程学】【数据科学】第五十一篇 数据仓库00 基础设计01 数据仓库设计的系统性解决方案,涵盖架构模式、分层设计、百万级访问支撑、海量数据配置及与数据库/数据湖的对接策略: ​​ODS(操作数据层)​​:原始数据镜像,保留历史快照 ​​DWD(明细数据层)​​:清洗、标准化、维度退化 ​​DWS(汇总数据层)​​:主题宽表、轻度聚合 ​​ADS(应用数据层)​​:高度聚合,面向报表/API ​​二、百万用户访问架构设计​​ ​​1. 核心架构组件​​ ​​2. 关键配置参数(以Snowflake为例)​​ ​​3. 性能优化措 阅读详情

1.加锁

    @Override
    public Map<String, List<Catelog2Vo>> getCatalogJson() {
        //先从缓存中尝试获取,若为空则从数据库中获取然后放入缓存
        ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
        String catalogJson = opsForValue.get("catalogJson");
        System.out.println("从缓存内查询...");
        synchronized (this) {
            if (StringUtils.isEmpty(catalogJson)) {
                Map<String, List<Catelog2Vo>> catalogJsonFromDb = getCatalogJsonFromDb();
                System.out.println("从数据库内查询...");
                String str = JSON.toJSONString(catalogJsonFromDb);
                opsForValue.set("catalogJson", str, 1, TimeUnit.DAYS);
                return catalogJsonFromDb;
            }
        }

        Map<String, List<Catelog2Vo>> catalogJsonFromCache = JSON.parseObject(catalogJson, new TypeReference<Map<String, List<Catelog2Vo>>>() {
        });
        return catalogJsonFromCache;
    }

压力测试

为什么呢?后面会说

2.加锁逻辑改良

改良下,把从缓存中获取数据也加入锁逻辑中

    @Override
    public Map<String, List<Catelog2Vo>> getCatalogJson() {
        //先从缓存中尝试获取,若为空则从数据库中获取然后放入缓存
        String catalogJson;
        synchronized (this) {
            ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
            catalogJson = opsForValue.get("catalogJson");
            System.out.println("从缓存内查询...");
            if (StringUtils.isEmpty(catalogJson)) {
                Map<String, List<Catelog2Vo>> catalogJsonFromDb = getCatalogJsonFromDb();
                System.out.println("从数据库内查询...");
                String str = JSON.toJSONString(catalogJsonFromDb);
                opsForValue.set("catalogJson", str, 1, TimeUnit.DAYS);
                return catalogJsonFromDb;
            }
        }

        Map<String, List<Catelog2Vo>> catalogJsonFromCache = JSON.parseObject(catalogJson, new TypeReference<Map<String, List<Catelog2Vo>>>() {
        });
        return catalogJsonFromCache;
    }

再次压测,发现结果正常,只查询了一次数据库

因此,加锁时,思考加锁代码块逻辑很重要 ,上面就是因为锁等待时因为加锁地方不对,头几个线程会处于一种缓存中查询数据为空的阶段,然后当第一个线程执行完保存数据

到缓存后后面进来的线程才会从缓存中获取数据,这也就是出现多次从数据库中查询的原因了

定位分析RCU stall问题 在编译内核时打开或者在启动参数中增加这样统计信息是在采样周期中收集的。其中number行分别是发生stalled的cpu上的硬中断,软中断,和上下文的切换次数cputime行的前三列分别是硬中断,软中断和任务消耗的cpu时间,单位为ms.最后一个数字是统计的周期时间(ms).因为用户态的任务通常不会引起RCU CPU stalls,所以任务通常是内核任务,这也是为什么只统计system cpu的原因. 阅读详情

相关推荐

结构力学程序算法理论基础(一)————虚功原理

1.约束 定义约束:限制质点或者质点系运动的条件称为约束,表示这些限制条件的数学方程称为约束方程。 (1)几何约束 限制质点或者质点系在空间的几何位置的条件称为几何约束.如单摆,其中质点M可绕固定点O在平面Oxy内摆动,摆长为l.这时摆杆对质点的限制条件是:质点M必须在以点O为圆心,以l为半径的圆周上运动.其约束方程为: 又质点M在固定的曲面上运动,那么曲面方程就是质点M的约束方程,即 上...

l93919861的博客 4511

Redis缓存(整合SpringCache简化缓存开发)+本地锁synchronized/Redis锁setnx/分布式锁Redssion在实际项目中的应用

Redis缓存(整合SpringCache简化缓存开发)+本地锁synchronized/Redis锁setnx/分布式锁Redssion在实际项目中的应用

weixin_40270540的博客 361

【rotors】多旋翼无人机仿真(五)——多无人机仿真

如何创建多个无人机仿真

caiqidong321的博客 2393

缓存使用&加锁

SpringBoot整合resis、springcache分布式下加锁使用缓存

ww_kobe的博客 1165

Keil MDK编译错误#541解决方案与ARM_Compiler包解析

在嵌入式开发中,编译器工具链的依赖管理是确保项目顺利构建的关键环节。以Keil MDK为例,其软件包依赖机制通过组件化设计实现功能解耦,其中ARM_Compiler包专门处理系统IO重定向等编译器扩展功能。这种架构既提升了模块复用性,也带来了版本兼容性挑战。当出现'Error #541: component missing'报错时,通常是由于中间件组件(如文件系统)在新版本中显式依赖了ARM_Compiler包。开发者需要通过Pack Installer安装该包,并在Run-Time Environment

weixin_32129187的博客 368

斗罗大陆叙事体系与战斗系统设计解析

在文学创作与游戏设计中,世界观构建和战斗系统设计是两大核心技术要素。世界观作为故事发生的背景框架,需要融合东西方文化元素并建立量化标准,如《斗罗大陆》中武魂觉醒与魂环等级体系。战斗系统则需突破简单数值对抗,发展出武魂特性、魂技组合与环境互动的三维体系,其中魂导器技术的引入展现了科技与魔法的创新融合。这些设计原理在RPG游戏开发、网络文学创作等领域具有广泛应用价值,特别是对需要长期运营的IP作品,完善的系统设定能有效支撑剧情延展与商业化开发。本文以现象级作品为例,剖析其武魂拟态理论和魂师工业化构思如何成就经典

weixin_29291069的博客 250

Redis分布式锁实战

什么是分布式锁 在单机部署的情况下,要想保证特定业务在顺序执行,通过JDK提供的synchronized关键字、Semaphore、ReentrantLock,或者我们也可以基于AQS定制化锁。单机部署的情况下,锁是在多线程之间共享的,但是分布式部署的情况下,锁是多进程之间共享的。那么分布式锁要保证锁资源的唯一性,可以在多进程之间共享。 分布式锁特性 保证同一个方法在某一时刻只能在一台机...

胡峻峥的博客 363

数据库迁移策略实战:MySQL到PostgreSQL

数据库迁移是一项复杂且细致的任务,需要充分的准备工作、合适的迁移策略和严格的验证与优化步骤。通过选择合适的迁移工具、进行手动迁移和应用程序适配、以及迁移后的验证与优化,可以确保数据迁移的成功和业务的连续性。希望本文的分享能够为大家在MySQL到PostgreSQL的数据库迁移实战中提供一些有用的参考和启示。

shejizuopin的博客 1732

Redis系列:使用Redis实现分布式锁及相关问题

分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。 本篇内容包括:关于 Redis 与 分布式锁,Redis 分布式锁的问题及解决方式,Redis 中的 Lua 脚本 以及 Redis 中的 RedLock 算法!

栗筝i的博客 6358

步进电机 cia402协议 报文自己的理解 (笔记)

步进电机 cia402协议 报文自己的理解 (笔记)

she666666的博客 3805

『杭电1199』Color the Ball

Problem Description There are infinite balls in a line (numbered 1 2 3 ....), and initially all of them are paint black. Now Jim use a brush paint the balls, every time give two integers a b and follow by a char 'w' or 'b', 'w' denotes the ball from a to

漠宸离若的博客 498

谷粒商城项目(学习笔记十)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基

qq_46396128的博客 946

MATLAB - 激光雷达 - 相机联合标定(Lidar-Camera Calibration)

激光雷达传感器和相机通常在自动驾驶应用中结合使用,因为激光雷达传感器收集三维空间信息,而相机则以二维图像捕捉空间的外观和纹理。您可以融合来自这些传感器的数据来改进物体检测和分类。激光雷达-相机标定可以估算出一个变换矩阵,给出两个传感器之间的相对旋转和平移。在进行激光雷达-相机数据融合时,您可以使用该矩阵。本图说明了激光雷达和相机标定 (LCC) 过程的工作流程,我们使用棋盘格作为标定对象。我们从激光雷达和相机数据中提取棋盘角和平面,然后在它们的坐标系之间建立几何关系,进行标定。

机器人控制与仿真应用 7371

【Redis】缓存击穿问题及其解决方案

第一个线程到来之后发现逻辑过期,于是获取互斥锁,再开启一个新线程去进行缓存重建。之后第一个线程成功缓存数据释放互斥锁之后,后面线程继续来访,发现命中缓存并且没有过期,返回重建数据。的实现思路就是在第一个线程到来的时候获取互斥锁,后面的线程来到之后尝试去获取互斥锁,获取失败,于是进行休眠重试。在线程1重建缓存的时候,线程2缓存又没命中,线程2也去重建缓存;:缓存击穿也叫做热点Key问题,就是少量被高并发访问并且缓存重建业务比较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的压力。

Decade_Faiz的博客 4470

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

怎么解决redis缓存击穿?(附解决方案)

redis缓存击穿是指一个热点key在失效的同时,大量的请求过来,从而会全部到达数据库,压垮数据库。

学亮编程手记 992

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Redis缓存击穿问题及解决思路

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

weixin_53604412的博客 3762

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java缓存为什么要加锁_使用缓存时对于加锁的思考(* * * * *)

突然发现之前写的自己实现XXX的话题不是很被大众关注,可能是真的写的不行,也可能是大多都是一些吃了饭没事做瞎写的一些东西,大家都没兴趣,之后可能会尽量写一些真正实用的东西,大家一起学习。言归正传,促使我研究这个话题的原因是在工作中遇到需要自己实现多级缓存的情况。比如在springboot中我们虽然可以随意替换缓存技术,可以使用redis也可以使用ehcache,但是据我所知,这些缓存默认都是只能使...

weixin_39923599的博客 348

缓存失效问题和分布式锁引进

【代码】缓存失效问题和分布式锁引进。

一个菜鸡的博客 1432

谷粒商城-高级篇-Day12-性能优化和缓存

对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发访问,是一种非常“热点”的数据,如果这个key在大量请求同时进来前正好失效,那么所有对这个key的数据查询都落到db,我们成为缓存击穿。指查询一个一定不存在的数据,由于缓存未命中,将去查询数据库,但是数据库也无记录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。大量并发只让一个人去查,其他人等待,查到以后释放锁,其他人获得锁,先查缓存,就会有数据,不用去db。

qq_57907966的博客 1292

加锁解决缓存击穿问题

一、加本地锁问题 1.1 本地锁分析 继上一篇Redis缓存中介绍,我们可以很容易解决缓存穿透(空结果缓存),和缓存雪崩问题(加随机值),对于缓存击穿问题,可以采用加锁的方式,但是,这个锁需要用什么样的锁,怎么来加这个锁,也是非常有讲究的,一不小心就可能导致各种问题。 这里我们先测试一下,加本地锁情况下的一些问题。 @Override public Map<String, List<Catelog2Vo>> getCatalogJson() {

Jak的博客 1839

Redis的缓存击穿及解决方案

缓存击穿指的是缓存中没有数据但数据库中有数据(一般是热点数据缓存时间到期),同一时间大量的并发请求由于读缓存没读到数据,就去数据库去取数据,导致某个时间内数据库压力剧增,导致崩溃。 缓存击穿的解决方案: 1.设置热点数据永远不过期(可以判断当前key快要过期时,通过后台异步线程在重新构建缓存) 2.接口限流与熔断,降级。重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制。 3.设置互斥锁。在并发的多个请求中,只有第一个请求线

eeeeety6208的博客 4554

Redis6应用问题解决——缓存穿透,缓存击穿,缓存雪崩,分布式锁

分布式锁:当在分布式模型下,数据只有一份(或有限制),此时需要利用锁技术来控制某一时刻修改数据的进程数。这种锁即为分布式锁。为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用并发处理相关的功能进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的应用并不能提供分布式锁的能力。为了解决这个问题就。

dingxiao123的博客 657

Redis篇:缓存击穿及解决方案

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了(有可能是正好过期了),无数的请求访问会在瞬间给数据库带来巨大的冲击。常见的解决方案有两种:互斥锁逻辑过期。

viperd的博客 4172

高并发下缓存失效问题-缓存穿透、缓存击穿、缓存雪崩、Redis分布式锁简单实现、Redisson实现分布式锁

基于Redis的setnx命令简单实现分布式锁,并在实现的过程中逐一暴露和处理各种问题,最后引出Redisson实现分布式锁

idooy的学习笔记 510

Redis篇--常见问题篇3--缓存击穿(数据查询上锁,异步操作,熔断降级,三种缓存问题综合优化策略)

缓存击穿是指某个热点数据在缓存中过期后,大量并发请求同时访问该数据,导致这些请求全部穿透到数据库,形成瞬间的高负载,给数据库和服务带来巨大的压力,甚至会崩溃。这种情况通常发生在高并发场景下,尤其是在某些热点数据的缓存过期时。对于不存在的数据,缓存空结果(如null),并设置较短的过期时间。(推荐)使用布隆过滤器快速判断数据是否存在。(不太推荐,过滤器准确度以及需要维护成本)为每个缓存项设置随机的过期时间,避免所有缓存项在同一时间点失效。(推荐)

weisian的博客 3万+

【Redis】缓存击穿问题及解决思路

如果缓存雪崩是无数key同时过期而引发的问题,那么缓存击穿就是部分key过期而导致的严重后果。那为什么部分key过期也会导致严重的后果?这是因为这部分key不是普通的key。缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。高并发访问:这个Key访问的非常多,可能是在做活动的某一件商品的缓存,同一时刻可能会有无数的请求来访问这一个key。

qq_39921135的博客 2016
上一篇: day101-缓存-缓存使用-缓存穿透、雪崩、击穿问题及解决方案
下一篇: day103-缓存-缓存使用-本地锁在分布式下的问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才是真的封不觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值