redis学习(009 实战:黑马点评:缓存穿透、缓存雪崩 、缓存击穿)

黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目

总时长 42:48:00 共175P

此文章包含第40p-第p45的内容


文章目录

    • 缓存穿透
      • 解决方案
        • 缓存空对象
        • 布隆过滤
      • 解决方案实现
      • 缓存穿透总结
    • 缓存雪崩
      • 解决方案
    • 缓存击穿
      • 解决方案
      • 解决方案实现
        • 互斥锁代码实现
        • 逻辑过期代码实现

缓存穿透

解决方案

缓存空对象

在这里插入图片描述

布隆过滤

用hash算法存储二进制数据在布隆过滤器里
如果布隆过滤器里不存在数据库里一定不存在,
如果布隆过滤器里存在数据库里不一定存在
在这里插入图片描述

解决方案实现

在这里插入图片描述
空值的缓存时间短一点 两三分钟
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里用shopJson != null不太容易理解 用 shopJson == “” 比较好
在这里插入图片描述

缓存穿透总结

在这里插入图片描述

缓存雪崩

解决方案

在这里插入图片描述


缓存击穿

在这里插入图片描述

解决方案

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对比
cep定理 在一致性和可用性中做选择
在这里插入图片描述

解决方案实现

在这里插入图片描述

setnx命令来实现互斥锁 只有key不存在的时候才能往里写数据
在这里插入图片描述

释放锁的时候直接删除就行 del key
在这里插入图片描述
ps:如果程序出问题了,无人再去释放这个锁了,就会产生死锁
可以设置一个有效期(如10秒)来兜底,否则可能会发生死锁问题 【有效期也不能太短(逻辑未执行完就释放了)】

互斥锁代码实现

在这里插入图片描述

加锁和释放锁代码↓
在这里插入图片描述

不要直接返回flag,容易返回null,会报空指针异常
return BooleanUtil.isTrue(flag); 相当于 return(flag != null)&& flag;
在这里插入图片描述
原来逻辑
在这里插入图片描述
在这里插入图片描述
新逻辑
在这里插入图片描述

这里使用了递归(ps:企业开发禁止写递归哦)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

模拟延时
在这里插入图片描述
使用jmeter进行并发测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

只触发了一次数据库查询
在这里插入图片描述

逻辑过期代码实现

在这里插入图片描述

两种方法 一种是将shop对象类继承RedisData
在这里插入图片描述

在这里插入图片描述

一种是组合
在这里插入图片描述
ps:组合(组合复用)优于继承,侵入性低

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

如果报空指针加上@RunWith(SpringRunner.class)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
注意:分布式可以复查,否则会有几率多次查数据库,这里就算多次重建也没影响啊,每个线程都要加锁就决定了并发量不会大。这又不像单例那样规定死了
doublecheck的意义:如果等待的线程缓存未命中,想要获取锁时,刚好缓存重建完毕,redis中已经有数据了,而且锁也被释放了,此时缓存未命中的线程就会获取到锁导致缓存再次重建

写个线程池
在这里插入图片描述
在这里插入图片描述

直接用之前的方法
在这里插入图片描述
这里测试使用20秒 实际最好设置30分钟
在这里插入图片描述
在这里插入图片描述
ps:这个锁的粒度加的有点大

这里的逻辑过期 是可以在过期之后进行重新加载 使用新的数据 ,这个值一直是存在于redis中的,只是过期之前可能使用的一直是旧数据

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

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

相关文章

C++:获取当前可执行核心数(开辟线程)

sysconf(_SC_NPROCESSORS_ONLN) 是一个在 POSIX 兼容系统上广泛使用的函数,它用于获取当前系统上可用的处理器(CPU 核心)的数量。这个函数是 sysconf 函数的一个特定调用,其中 _SC_NPROCESSORS_ONLN 是一个常量,指定了…

Go协程与通道的综合应用问题

1.简单了解什么是协程和通道 什么是协程 协程,是一种用户级的轻量级的线程,拥有独立的栈空间并共享程序的堆空间。 它是在单线程的基础上通过算法来实现的微线程,相比于多线程编程具有以下优点: 协程的上下文切换由用户决定&a…

基于Go1.19的站点模板爬虫详细介绍

构建一个基于Go1.19的站点模板爬虫是一项有趣且具有挑战性的任务。这个爬虫将能够从网站上提取数据,并按照指定的模板进行格式化。以下是详细的介绍和实现步骤。 1. 准备工作 工具和库: Go 1.19colly:一个强大的Go爬虫库goquery:一个类似于 jQuery 的Go库,用于解析 HTML…

1071 - Specified key was too long; max key length is 3072 bytes Mysql报错解决方法

错误信息 “Specified key was too long; max key length is 3072 bytes” 是在MySQL数据库中创建索引时可能出现的问题,通常出现在尝试创建一个过长的唯一键(UNIQUE KEY)或主键(PRIMARY KEY)时。MySQL对于InnoDB存储引…

Codeforces Round 957 (Div.3)

传送门 A. Only Pluses 时间限制:1秒 空间限制:256MB 输入:标准输入 输出:标准输出 问题描述 Kmes 写下了三个整数 a、b 和 c,以记住他要给 Noobish_Monk 的香蕉数量是 a b c。 Noobish_M…

vue3<script setup>自定义指令

main.ts // 自定义指令 app.directive(color,(el,binding) > {el.style.color binding.value })这段代码定义了一个名为color的自定义指令,并将其注册到Vue应用实例app上。自定义指令接收两个参数:el和binding。el是绑定指令的元素,而bi…

Ubuntu22.04安装NIVIDIA显卡驱动总结

1.首先在安装驱动时需要判断系统有无GPU以及GPU的型号 可以参考这篇文章: https://blog.51cto.com/u_13171517/8814753#:~:textubuntu%20%E7%B3%BB%E7%BB%9F%20%E6%80%8E%E4%B9%88%E5%88%A4%E6%96%AD%E7%B3%BB%E7%BB%9F%E6%9C%89%E6%B2%A1%E6%9C%89GPU%201%20%E6%…

【C++】函数重载详解

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

【LLM大模型】Langchain 介绍与入门

官方介绍 LangChain 是一个利用LLM开发应用程序的框架。它让应用程序具备: 上下文感知能力:将LLM连接到上下文源(提示说明、少量示例、用以形成其响应的内容等)推理:依靠LLM进行推理(例如根据提供的上下文…

全网最详细单细胞保姆级分析教程

各位读者,好久不见,我又归来了,之后的一段时候我将以Rstudio分析单细胞的RNA-seq流程为主,希望各位读者朋友多多支持! 1. pbmc单样本分析 1.包的加载 library(multtest) library(dplyr) library(Seurat) library(patchwork) library(R.utils)2. 清除环境变量 rm(list ls))…

深度解析蚂蚁 SEO 蜘蛛池:提升网站流量的有效利器

在当今数字化时代,网站流量对于企业和个人的在线业务成功至关重要。为了在竞争激烈的网络环境中脱颖而出,众多站长和 SEO 从业者不断探索各种优化策略,其中蚂蚁 SEO 的蜘蛛池成为备受关注的工具之一。 蚂蚁 SEO 蜘蛛池是一种创新的技术手段&a…

HarmonyOS鸿蒙开发入门 , ArkTS语言的了解

鸿蒙(即HarmonyOS,开发代号Ark,正式名称为华为终端鸿蒙智能设备操作系统软件)是由华为公司2012年以来开发的分布式操作系统,并于2019年8月正式发布。该系统利用“分布式”技术,将手机、电脑、平板、电视、汽…

画封装步骤

parameter参数 1.打开pad designer 2.设计单位mils改为millimeter,保留decimal layers 3.勾选☑️single layer mode

游戏厅ps5体验馆计时收费软件 佳易王电玩馆计时器定时语音提醒系统操作教程

前言: 游戏厅ps5体验馆计时收费软件 佳易王电玩馆计时器定时语音提醒系统操作教程 以下软件操作教程以,佳易王游戏厅电玩店计时计费管理系统软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 一、软件操作教程 1、计…

【Python】人生重开模拟器(实现代码)

一、游戏背景介绍 这是一款文字类小游戏。玩家输入角色的初始属性之后,就可以开启不同的人生经历。 完整的程序代码较多,此这里只实现其中的一部分逻辑(主要目的:巩固前面学习的 Python 语法基础)。 二、设置初始属性…

springboot企业人力资源管理系统-计算机毕业设计源码29005

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

Redis 主从复制,哨兵与集群

目录 一.redis主从复制 1.redis 主从复制架构 2.主从复制特点 3.主从复制的基本原理 4.命令行配置 5.实现主从复制 6.删除主从复制 7.主从复制故障恢复 8.主从复制完整过程 9.主从同步优化配置 二.哨兵模式(Sentinel) 1.主要组件和概念 2.哨…

基于复旦微V7 690T FPGA +ARM/海光X86+AI的全国产化数据采集人工智能平台

国产化FPGA:JFM7VX690T80主机接口:PCIe Gen3 x88Gbps/lane光纤通道:前面板4路SFP光纤,后面板1路QSFP光纤2组独立的DDR3 SDRAM 缓存,工作时钟频率800MHz2个FMC接口扩展:每个支持16路GTH,线速率10…

提示词工程(Prompt Engineering)是什么?

一、定义 Prompt Engineering 提示词工程(Prompt Engineering)是一项通过优化提示词(Prompt)和生成策略,从而获得更好的模型返回结果的工程技术。 二、System message 系统指令 System message可以被广泛应用在&am…

子载波间隔如何确定

OFDM子载波间隔公式 在OFDM系统中,子载波间隔Δf的基本公式为: Δf 1 / T 其中: Δf 是子载波间隔(Hz)T 是OFDM符号周期(秒) 公式解释 这个公式源于保持子载波正交性的需求。 当子载波间隔等于OFDM符号速率的倒数时,可以实现最小的频谱重叠,同时保持正交性。 这个间隔确…