Redis-预热雪崩击穿穿透
预热雪崩穿透击穿

缓存预热

缓存雪崩

有这两种原因
- redis key 永不过期or过期时间错开
- redis 缓存集群实现高可用
- 主从哨兵
- Redis Cluster
- 开启redis持久化aof,rdb,尽快恢复集群
- 多缓存结合预防雪崩:本地缓存 ehcache + redis 缓存
- 服务降级:Hystrix 或者 sentinel 限流降级
- 人民币玩家:阿里云给了你多少广告?笑
缓存穿透
恶意请求不存在的数据




- guava BloomFilter

- 误判问题,但是概率小可以接受,不能从布隆过滤器删除 -> 布隆过滤器可能会错误地判断某个元素存在于集合中(称为误报),但不会错误地判断一个存在的元素不存在
- 全部合法的key都需要放入 Guava布隆过滤器+redis里面,不然数据就是返回null
案例
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version>
</dependency>
@Service
@Slf4j
public class GuavaBloomFilterService {// 1.定义一个常量public static final int _1W = 10000;// 2.定义我们guava布隆过滤器,初始容量public static final int SIZE = 100 * _1W;// 3.误判率,它越小误判的个数也越少(思考:是否可以无限小? 没有误判岂不是更好)public static double fpp = 0.0000000000003; // 这个数越小所用的hash函数越多,bitmap占用的位越多 默认的就是0.03,5个hash函数 0.01,7个函数// 4.创建guava布隆过滤器private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), SIZE, fpp);public void guavaBloomFilter() {// 1. 往 bloomFilter 中添加数据for (int i = 0; i < SIZE; i++) {bloomFilter.put(i);}// 2. 故意取10w个不在范围内的数据进行测试,来进行误判率演示List<Integer> list = new ArrayList<>(10 * _1W);// 3. 验证for (int i = SIZE; i < SIZE + (10 * _1W); i++) {if (bloomFilter.mightContain(i)) {
// log.info("被误判了:{}", i);list.add(i);}}log.info("误判总数量:{}", list.size());log.info("误判率:{}", list.size() / (10 * _1W));}
}
@SpringBootTest
public class GuavaTest {@ResourceGuavaBloomFilterService guavaBloomFilterService;/*** guava版本布隆过滤器,helloworld 入门级演示*/@Testpublic void testGuavaWithBloomFilter() {System.out.println("testGuavaWithBloomFilter");// 1. 创建 guava版布隆过滤器BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100);//2. 判断指定的元素是否存在System.out.println(bloomFilter.mightContain(1));System.out.println(bloomFilter.mightContain(2));// 2. 添加数据bloomFilter.put(1);bloomFilter.put(2);System.out.println(bloomFilter.mightContain(1));System.out.println(bloomFilter.mightContain(2));}@Testpublic void testGuavaWithBloomFilter2() {guavaBloomFilterService.guavaBloomFilter();}}
fpp 默认 0.03


fpp要求越高,bit位数越多,hash函数越多

guava 黑名单使用

缓存击穿

对比穿透和击穿



互斥更新->对于更新的方法
聚划算案例

功能分析
数据结构使用 list
代码
@ApiModel(value = "聚划算活动product信息")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Product {// 产品idprivate Long id;// 产品名称private String name;// 产品价格private Integer price;// 产品详情private String detail;
}
@Service
@Slf4j
public class JHSTaskService {private static final String JHS_KEY = "jhs";private static final String JHS_KEY_A = "jhs:a";private static final String JHS_KEY_B = "jhs:b";@AutowiredRedisTemplate redisTemplate;/*** 模拟从数据库读取20件特价商品* @return 商品列表*/private List<Product> getProductsFromMysql() {List<Product> list = new ArrayList<>();for (int i = 0; i < 20; i++) {Random random = new Random();int id = random.nextInt(1000);Product product = new Product((long) id, "product" + i, i, "detail");list.add(product);}log.info("模拟从数据库读取20件特价商品完成{}", list);return list;}@PostConstructpublic void initJHSAB() {log.info("启动AB的定时器 天猫聚划算模拟开始===========");new Thread(() -> {while (true) {// 2.模拟从mysql查到数据,加到 redis 并返回给页面List<Product> list = getProductsFromMysql();redisTemplate.delete(JHS_KEY);redisTemplate.opsForList().leftPushAll(JHS_KEY, list);redisTemplate.expire(JHS_KEY, 86410L, TimeUnit.SECONDS);// 5.暂停一分钟,间隔1分钟执行一次,模拟聚划算一天执行的参加活动的品牌try {Thread.sleep(1000* 60);} catch (InterruptedException e) {e.printStackTrace();}}}, "t1").start();}}
测试类
@SpringBootTest
@Slf4j
public class JhsTest {private static final String JHS_KEY = "jhs";private static final String JHS_KEY_A = "jhs:a";private static final String JHS_KEY_B = "jhs:b";@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void find() {int page = 1;int size = 10;List<Product> list = null;long start = (page - 1) * size;long end = start + size - 1;try {list = redisTemplate.opsForList().range(JHS_KEY, start, end);if (CollectionUtils.isEmpty(list)) {// TODO 走 mysql 查询}log.info("参加活动的商家={}", list);} catch (Exception e) {// 出异常了,一般 redis 宕机了或者redis网络抖动导致timeoutlog.error("jhs exception{}", e);e.printStackTrace();// ..... 重试机制 再次查询 mysql}log.info(list.toString());}}
测试方法,先跑主启动类(后台更新聚划算商品信息),然后手动执行测试类测试查询
问题分析

delete 执行间隙,这一瞬间缓存击穿,打到mysql
解决


@PostConstructpublic void initJHSAB() {log.info("启动AB的定时器 天猫聚划算模拟开始===========");new Thread(() -> {while (true) {// 2.模拟从mysql查到数据,加到 redis 并返回给页面List<Product> list = getProductsFromMysql();// redisTemplate.delete(JHS_KEY);
// redisTemplate.opsForList().leftPushAll(JHS_KEY, list);
// redisTemplate.expire(JHS_KEY, 86410L, TimeUnit.SECONDS);// 3.先更新B缓存并且让B缓存过期时间超过A时间,如果A突然失效了还有B兜底,防止击穿redisTemplate.delete(JHS_KEY_B);redisTemplate.opsForList().leftPushAll(JHS_KEY_B, list);redisTemplate.expire(JHS_KEY_B, 86410L, TimeUnit.SECONDS);// 4.再更新A缓存redisTemplate.delete(JHS_KEY_A);redisTemplate.opsForList().leftPushAll(JHS_KEY_A, list);redisTemplate.expire(JHS_KEY_A, 86400L, TimeUnit.SECONDS);// 5.暂停一分钟,间隔1分钟执行一次,模拟聚划算一天执行的参加活动的品牌try {Thread.sleep(1000* 60);} catch (InterruptedException e) {e.printStackTrace();}}}, "t1").start();}
@Testpublic void findAB() {int page = 1;int size = 10;List<Product> list = null;long start = (page - 1) * size;long end = start + size - 1;try {list = redisTemplate.opsForList().range(JHS_KEY_A, start, end);if (CollectionUtils.isEmpty(list)) {log.info("---------A缓存已经过期或活动结束了,记得人工修补,B缓存继续顶着");// A 没有来找 Blist = redisTemplate.opsForList().range(JHS_KEY_B, start, end);if (CollectionUtils.isEmpty(list)) {// TODO 走 mysql 查询}}log.info("参加活动的商家={}", list);} catch (Exception e) {// 出异常了,一般 redis 宕机了或者redis网络抖动导致timeoutlog.error("jhs exception{}", e);e.printStackTrace();// ..... 重试机制 再次查询 mysql}log.info(list.toString());}
小总结

相关文章:
Redis-预热雪崩击穿穿透
预热雪崩穿透击穿 缓存预热 缓存雪崩 有这两种原因 redis key 永不过期or过期时间错开redis 缓存集群实现高可用 主从哨兵Redis Cluster开启redis持久化aof,rdb,尽快恢复集群 多缓存结合预防雪崩:本地缓存 ehcache redis 缓存服务降级&…...
jvisualvm学习
系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…...
Gazebo环境下开源UAV与USV联合仿真平台
推荐一个ROS2下基于Gazebo环境的开源UAV与USV联合仿真平台。平台是由两个开源项目共同搭建的。首先是UAV仿真平台,是基于PX4官方仿真平台(https://docs.px4.io/main/en/sim_gazebo_gz);其次是USV仿真平台,是基于VRX仿真…...
Linux进程调度和进程切换
并行(Parallel) 含义:并行是指多个任务在同一时刻同时执行。 硬件要求:需要多个处理器(如多核CPU)或者多台计算设备来实现,这些执行单元能够真正地同时处理不同的任务。例如,一个具…...
机器学习基本上就是特征工程——《特征工程训练营》
作为机器学习流程的一部分,特征工程是对数据进行转化以提高机器学习性能的艺术。 当前有关机器学习的讨论主要以模型为中心。更应该关注以数据为中心的机器学习方法。 本书旨在介绍流行的特征工程技术,讨论何时以及如何运用这些技术的框架。我发现&…...
Android Framework AMS(01)AMS启动及相关初始化1-4
该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多,因此拆成2个章节,本章节是第一章节&…...
基于基于微信小程序的社区订餐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
[单master节点k8s部署]29.Istio流量管理(五)
测试istio熔断管理。 采用httpbin镜像和fortio镜像,其中httpbin作为服务端,fortio是请求端。这两个的配置yaml文件都在istio的samples/httpbin目录下,fortio的配置文件在samples-client目录下。 [rootmaster httpbin]# ls gateway-api ht…...
Something for 24OI
zyj老师希望我给24OI的同学们写一点东西,虽然感觉我也没有什么先进经验,还是尽力写一些主观的感受吧。 如何平衡文化课和竞赛的关系?不要以牺牲文化课的代价学习竞赛。首先,绝大多数的竞赛同学,或早或晚都会在退役后回…...
【React】事件机制
事件机制 react 基于浏览器的事件机制自身实现了一套事件机制,称为合成事件。比如:onclick -> onClick 获取原生事件:e.nativeEvent onClick 并不会将事件代理函数绑定到真实的 DOM节点上,而是将所有的事件绑定到结构的最外层…...
华为OD的职级与薪资
华为 OD 这几年随着招聘行情的日渐严峻,不少 985 高校出来的学生都开始放宽对"外包"的看法,其中华为 OD 以"待遇断层领先"的姿态成为不少求职者(不得已)的外包首选。 既然如此,我们就好好梳理一下…...
【HTML5】html5开篇基础(4)
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...
HTTP【网络】
文章目录 HTTPURL(Uniform Resource Lacator) HTTP协议格式HTTP的方法HTTP的状态码HTTP常见的Header HTTP 超文本传输协议,是一个简单的请求-响应协议,HTTP通常运行在TCP之上 URL(Uniform Resource Lacator) 一资源定位符,也就是通常所说的…...
MQ延迟消息:原理、实现与应用
在现代分布式系统中,消息队列(Message Queue,简称MQ)已经成为实现异步通信、解耦服务和削峰填谷的重要工具。延迟消息(Delayed Message)作为MQ的一种高级特性,允许消息在指定的延迟时间后投递到…...
计算机网络—大端序和小端序
大端序和小端序 大端序(Big-endian)和小端序(Little-endian)是指在多字节数据类型(如整数或浮点数)的存储和表示方式上的不同。以下是关于大端序和小端序的详细解释: 一、定义 大端序…...
《OpenCV 计算机视觉》—— Harris角点检测、SIFT特征检测
文章目录 一、Harris 角点检测1.基本思想2.检测步骤3.OpenCV实现 二、SIFT特征检测1. SIFT特征检测的基本原理2. SIFT特征检测的特点3. OpenCV 实现 一、Harris 角点检测 OpenCV中的Harris角点检测是一种基于图像灰度值变化的角点提取算法,它通过计算每个像素点的响…...
rtmp协议转websocketflv的去队列积压
websocket server的优点 websocket server的好处:WebSocket 服务器能够实现实时的数据推送,服务器可以主动向客户端发送数据 1 不需要客户端不断轮询。 2 不需要实现httpserver跨域。 在需要修改协议的时候比较灵活,我们发送数据的时候比较…...
Elasticsearch实战应用:构建高效搜索引擎
在大数据时代,如何高效存储和检索海量信息成为了一个重要课题。Elasticsearch作为一个开源的分布式搜索引擎,以其强大的搜索能力和灵活的扩展性,成为了许多企业和开发者的首选。本文将深入探讨Elasticsearch的实战应用,包括基本概…...
Hive数仓操作(四)
一、Hive 创建表案例一(ARRAY数组类型) 1. 准备数据文件 首先,准备一个名为 stu2.txt 的文件,文件内容示例如下: 1001 Alice fish,cat 1002 Bob dog,rabbit 1003 Charlie bird注意: …...
《C++跨平台开发:突破界限,释放无限可能》
在当今的软件开发领域,跨平台开发已成为一种重要趋势。它允许开发者编写一次代码,然后在多个不同的操作系统和硬件平台上运行,极大地提高了开发效率和软件的可扩展性。而 C作为一种强大的编程语言,也具备实现跨平台开发的能力。本…...
Graphormer开源模型价值:替代传统QSAR方法的深度学习新范式
Graphormer开源模型价值:替代传统QSAR方法的深度学习新范式 1. Graphormer模型概述 Graphormer是微软研究院开发的基于纯Transformer架构的图神经网络模型,专门为分子图(原子-键结构)的全局结构建模与属性预测而设计。这个创新模…...
从理论到面包板:手把手搭建Series-Shunt反馈放大器(含阻抗匹配避坑指南)
从理论到面包板:手把手搭建Series-Shunt反馈放大器(含阻抗匹配避坑指南) 在电子工程实践中,反馈放大器设计是模拟电路领域的核心技能之一。Series-Shunt结构因其出色的电压放大特性和相对简单的实现方式,成为初学者入门…...
Phi-3-mini-4k-instruct-gguf一键部署:VMware虚拟机Ubuntu系统安装全流程
Phi-3-mini-4k-instruct-gguf一键部署:VMware虚拟机Ubuntu系统安装全流程 1. 准备工作与环境搭建 在开始之前,我们需要准备好必要的软件和资源。这个教程适合那些习惯在虚拟化环境中工作的开发者,特别是需要在本地测试后再部署到生产环境的…...
R语言实战:利用compareGroups包高效生成临床研究三线表(Table1)
1. 为什么临床研究离不开Table1三线表 在医学论文和临床研究报告中,Table1三线表几乎是标配。我第一次投稿时,审稿人直接指出"缺少规范的基线特征表",这才意识到这个表格的重要性。Table1的核心作用是展示研究人群的基线特征&#…...
FASTDDS-Python 实战:从零构建分布式通信环境
1. 为什么选择Fast DDS-Python? 在物联网和机器人系统中,设备间的实时通信是个硬需求。想象一下,你正在开发一个智能仓储机器人系统,需要让多台机器人在复杂环境中协同工作。这时候,传统的HTTP请求-响应模式就显得力不…...
langchain4j 学习系列(9)-AIService与可观测性
一、基本用法1.1 定义业务接口View Code注:{{it}}是langchain4j内部约定的默认占位符名。当只有1个参数时,{{it}}在运行时,会自动替换成用户的prompt. 当然也可以强制指定参数名,就本示例而言,注释的二种写法ÿ…...
如何用代码思维提升90%图表效率?揭秘Mermaid的可视化革命
如何用代码思维提升90%图表效率?揭秘Mermaid的可视化革命 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edi…...
002
...
ChatGPT_JCM大型应用架构:处理复杂需求的前端解决方案
ChatGPT_JCM大型应用架构:处理复杂需求的前端解决方案 【免费下载链接】ChatGPT_JCM 项目地址: https://gitcode.com/gh_mirrors/ch/ChatGPT_JCM ChatGPT_JCM是一个基于前端技术构建的大型AI应用解决方案,专为处理复杂交互需求和提供流畅用户体验…...
效率革命:用快马AI生成即用代码模块,替代海量opencode搜索与整合
效率革命:用快马AI生成即用代码模块,替代海量opencode搜索与整合 最近在开发一个电商后台管理系统时,遇到了一个很常见的需求:需要一个功能完善的商品数据表格组件。按照传统做法,我大概会经历以下痛苦流程࿱…...
