什么是缓存穿透

缓存穿透是指当秒杀请求在Redis中未命中缓存时,系统会转而查询数据库。若数据库中也不存在该数据,大量此类请求将直接冲击数据库,造成数据库负载激增。
在这里插入图片描述

解决方案

缓存空值

当我们查询数据库发现数据库当中也不存在该数据时,这时候我们可以将空值缓存到Redis当中,这样下一次请求再次查询该数据时,就会从缓存中获取信息。
在这里插入图片描述

public String selectUser(String userId) {String cacheData = cache.get(userId);if (StrUtil.isBlank(cacheData)) {// 判断 Key 是否包含空值缓存,存在直接返回,不存在继续流程Boolean cacheIsNull = cache.hasKey("is-null_" + userId);if (cacheIsNull) {throw new RuntimeException();}String dbData = userMapper.selectId(userId);if (StrUtil.isNotBlank(dbData)) {cahce.set(userId, dbData);cacheData = dbData;} else {// 查询数据库中不存在数据,添加空值缓存并返回cache.set("is-null_" + userId, 较短过期时间);throw new RuntimeException();}}return cacheData;
}

但是这种方式也会存在一些弊端:当短时间内存在大量恶意请求时,缓存系统就会存在大量内存占用。

布隆过滤器

什么是布隆过滤器,布隆过滤器的原理

布隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。它以牺牲一定的准确性为代价,换取了存储空间的极大节省和查询速度的显著提升。

布隆过滤器是由一个位数组和一组哈希函数组成,当将数据存入数据库时,会先通过一组哈希函数,计算出该数据对应的哈希数值,再通过取模,将对应位数组的相应位置改为1。从而将数据进行标记。当查询数据库时,会先通过布隆过滤器检查该数据是否存在,如果该数据对应的位数组的位置全为1,则可能存在,继续查询数据库,反之,如果有任何一位为0,则一定不存在,不会去查询数据库。
在这里插入图片描述

布隆过滤器的优点和缺点

布隆过滤器的优点在于它可以高效地判断一个元素是否属于一个大规模集合,且具有极低的存储空间要求。如果存储 1亿元素,误判率设置为 0.001 也就是千分之一,仅需要占用 171M 左右的内存。

缺点在于可能会存在一定的误判率。

它在实际应用中常用于缓存场景下缓存穿透问题,对访问请求做一个快速判断机制。使用布隆过滤器能够有效减轻对底层存储系统的访问以及缓存系统的存储压力。

但是布隆过滤器本身也存在一些“弊端”,那就是不支持删除元素。因为它是一种基于哈希的数据结构,删除元素会涉及到多个哈希函数之间的冲突问题,这样会导致删除一个元素可能会影响到其他元素的正确性。

总的来说,布隆过滤器是一种非常高效的数据结构,适用于那些可以容忍一定的误判率的场合。

在这里插入图片描述
用布隆过滤器解决缓存穿透伪代码

public String selectUser(String userId) {String cacheData = cache.get(userId);if (StrUtil.isBlank(cacheData)) {if (!bloomFilter.contains(fullShortUrl)) {throw new RuntimeException();}String dbData = userMapper.selectId(userId);if (StrUtil.isNotBlank(dbData)) {cahce.set(userId, dbData);cacheData = dbData;}}return cacheData;
}

但是使用布隆过滤器还有可能发生哈希碰撞,导致判断错误。还是有可能导致该请求进入到数据库。那么接下来就需要将这些方法组合到一起使用。

布隆过滤器,缓存空值,分布式锁

当一个秒杀请求进入Redis,先判断Redis中是否有值,发现没有,接着去判断布隆过滤器中是否含有该数据,如果没有,直接返回无。如果监测到存在,就去先获取分布式锁,再去数据库当中进行查询。同时在查询之前还需要进行双重判断,即再次判断一下缓存中是否有值。(目的是防止该线程在等待锁期间其他线程已经查询到信息并将信息缓存到Redis当中)当从数据库中查询到后,再将该数据存入到Redis当中,并返回结果。
在这里插入图片描述
伪代码

public String selectUser(String userId) {String cacheData = cache.get(userId);if (StrUtil.isBlank(cacheData)) {// 判断 Key 是否存在布隆过滤器,存在则继续流程,否则直接返回if (!bloomFilter.contains(fullShortUrl)) {throw new RuntimeException();}// 判断 Key 是否包含空值缓存,存在直接返回,不存在继续流程Boolean cacheIsNull = cache.hasKey("is-null_" + userId);if (cacheIsNull) {throw new RuntimeException();}// 获取分布式锁Lock lock = getLock(userId);lock.lock();try {// 拿到锁之后进行双重判定,如果缓存已经存在则直接返回即可cacheData = cache.get(userId);if (StrUtil.isNotBlank(cacheData)) {return cacheData;}// 拿到锁之后进行双重判定,如果空值缓存已经存在则直接终止流程即可cacheIsNull = cache.hasKey("is-null_" + userId);if (!cacheIsNull) {throw new RuntimeException();}// 根据用户标识查询数据库记录String dbData = userMapper.selectId(userId);if (StrUtil.isNotBlank(dbData)) {cahce.set(userId, dbData);cacheData = dbData;} else {// 查询数据库中不存在数据,添加空值缓存并返回cache.set("is-null_" + userId, 较短过期时间);throw new RuntimeException();}} finally {lock.unlock();}}return cacheData;
}

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

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

相关文章

SpringBoot与Rust实战指南

基于Spring Boot和Rust的实用 以下是基于Spring Boot和Rust的实用示例,涵盖常见开发场景,分为Spring Boot(Java)和Rust两部分: Spring Boot 示例 RESTful API 开发 @RestController @RequestMapping("/api") public class UserController {@GetMapping("…

【世纪龙科技】汽车整车维护仿真教学软件-智构整车维护实训

在职业院校汽车专业实训教学中,"设备损耗大、操作风险高、场景覆盖有限"三大痛点长期制约着教学质量提升——传统实训车间里,学生接触实车的机会受限于车辆台套数与维护周期,复杂工位流程难以反复演练;高危操作环节&…

CMake set_source_files_properties使用解析

set_source_files_properties() 是 CMake 中用于精细化控制源文件属性的多功能命令。除了设置编译标志外,它还有许多其他重要用途。以下是全面的用法解析:一、核心功能分类 1. 编译控制 编译器选项:COMPILE_FLAGS / COMPILE_OPTIONSset_sourc…

雷达微多普勒特征代表运动中“事物”的运动部件。

雷达微多普勒特征代表运动中“事物”的运动部件。 即使一个人在椅子上来回摇晃,肉眼看来这个动作也很简单。但对雷达来说,这是微动作的丰富混合:移动膝盖和腿、摆动手臂,甚至是倾斜的椅子。所有这些都会产生独特但复杂的微多普勒特…

FreeRTOS硬件中断发生时的现场

在FreeRTOS中,当硬件中断发生时,当前正在运行的任务会立即被挂起,处理器会跳转到中断相关的中断服务程序中,在中断服务程序执行期间,遵循以下规则:1、中断独占CPU,ISR拥有最高的执行优先级&…

kotlin语法和特性分析

核心设计哲学: 简洁 (Concise): 减少样板代码(如 getter/setter、类型推导),让代码表达更直接。安全 (Safe): 从语言层面设计来避免常见错误(尤其是空指针异常)。互操作性 (Interoperable): 与 Java 无缝集…

二进制数本身没有默认的有符号或无符号解释

文章目录1. ​**​硬件层面:CPU 不区分有符号/无符号​**​2. ​**​解释权在程序员手中​**​3. ​**​默认倾向性(非绝对规则)​**​4. ​**​如何避免混淆?​**​5. ​**​经典示例​**​总结1. **解释为无符号数(U…

(AI) Server (Hardware) Architecture

Overview by Atlas T800 Just found a good product demo. from Huawei for its Atlas T800, here 计算产品3D展示 First turn off all modules and we can delve into how this server is organized. Core This is an AI server with 910B as its main feature, which is …

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论数据可视化分析-用户评论词云图实现

大家好,我是java1234_小锋老师,最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程,持续更新中,计划月底更新完,感谢支持。今天讲解微博评论数据可视化分析-用户评论词云图实现…

【Linux学习|黑马笔记|Day1】Linux初识、安装VMware Workstation、安装CentOS7、远程连接、虚拟机快照

Linux DAY1 前言 因为之前MySQL学到安装Linux版本的MySQL了,需要安装虚拟机等等,所以我打算先学完Linux的全部课程,期间继续学MySQL 文章目录Linux DAY1一.1)操作系统概述2)Linux初识3)虚拟机4.1&#xff…

编程与数学 03-002 计算机网络 13_无线网络技术

编程与数学 03-002 计算机网络 13_无线网络技术一、无线网络的基本概念(一)无线通信的频段与标准(二)无线网络的优势与挑战二、无线局域网(WLAN)(一)802.11标准系列(二&a…

肖特基二极管MBR0540T1G 安森美ON 低电压 高频率 集成电路IC 芯片

MBR0540T1G ON Semiconductor:超低VF肖特基二极管,重新定义电源效率!🔥 一、产品简介 MBR0540T1G 是安森美(ON Semiconductor)推出的0.5A/40V肖特基势垒二极管,采用专利沟槽结构,专…

windows内核研究(软件调试-调试事件采集)

软件调试调试事件采集前面有说到在调试器和被调试之间会创建一个_DEBUG_OBJECT对象来进行关联调试事件的种类 被调试进程会把一个个的调试事件写到_DEBUG_OBJECT中的一个成员链表中,调试器就通过它们建立的 _DEBUG_OBJECT调试对象获取调式事件,但并不是进…

Web开发-PHP应用组件框架前端模版渲染三方插件富文本编辑器CVE审计

类别组件/框架说明[Web框架]Laravel现代化、功能全面的框架,适合大多数Web应用。Symfony高度模块化、功能强大的框架,适合复杂应用。CodeIgniter轻量级框架,适合快速开发。Zend Framework (Laminas)企业级框架,适合大规模应用&…

Spring Boot Actuator 保姆级教程

1. 引言 Spring Boot Actuator 是一个功能强大的监控工具,能够帮助开发者监控和管理应用的运行状态。通过 Actuator,我们可以轻松获取应用的健康状况、配置信息、性能指标等。本文将一步步引导你如何配置和使用 Actuator,以及如何通过它来监控…

使用 whisper, 音频分割, 初步尝试,切割为小块,效果还不错 1

对于一首歌而言,如何断句?即,一个 mp4 或是 mp3 文件,或是一段录音, 如何使用程序,或是 ai 来断句。分割为一句一句的片段??如果人工来分割,一般是使用 capcut 之类的剪辑软件。但是效率太慢了。所以我想能否设计一个简洁的,自动的程序来处理。这种事情,专业的名称…

AD2S1210的DOS LOT含义

一、​​信号质量监控类寄存器​​​​LOT阈值(0x88)​​​​作用​​:设定信号丢失(Loss of Signal)的判定门槛。​​场景​​:当正弦或余弦输入信号幅值低于此值时,芯片认为信号丢失&#xff…

Au速成班-多轨编辑流程

基础编辑工作流,包含文件导入,导出,音量调节,部分效果添加。 创建多轨会话 设置工程文件名称、文件位置、采样率、位深度、主控等。 界面管理 ,界面说明详细可看 Au速成班-基础篇_au界面介绍-CSDN博客 音量调节点击…

Rust实现GPU驱动的2D渲染引擎

当传统CPU渲染遭遇性能瓶颈时,GPU驱动的架构正在革新2D图形领域。本文将深入解析用Rust编写的​​完全GPU驱动的2D渲染引擎Vello​​,揭秘其如何通过并行计算实现丝滑渲染。 一、GPU Driven革命:为何是Vello? 传统渲染的瓶颈 传…

【ELasticsearch】温、冷数据节点能是同一个节点吗

温、冷数据节点能是同一个节点吗1.节点角色与分层存储原理2.一个节点能否同时是 “温” 和 “冷” 节点 ?3.为什么通常不是最佳实践 ?4.可能的适用场景(非常有限)5.结论在 Elasticsearch 中,理论上,一个物理…