布隆过滤器实战

一、背景

本篇文章以解决实际需求的问题的角度进行切入,探讨了如果使用布隆过滤器快速丢弃无效请求,降低了系统的负载以及不必要的流量。

我们都知道布隆过滤器是以占用内存小,同时也能够实现快速的过滤从而满足我们的需求,本篇文章就不仔细展开说明布隆过滤器的工作原理,具体工作原理可以参考下面这篇博客。

Redis布隆过滤器的原理和应用场景,解决缓存穿透 - 知乎

二、实际要解决的问题

面临问题:在我们的日常工作中,我们通常是负责某个系统,例如订单系统、预约系统、保险系统等等,在一整个业务流程中,我们只是负责某一业务系统,我们都会有自己的上下游,以预约系统为例,订单系统(下游)根据预约单号查询预约系统是否有预约,从而处理对应逻辑,但并不是所有的订单都是有预约的,大部分的订单是没有的,对于我预约系统来说,订单系统大部分的查询都是无效的,但是如果我只是使用数据库的前提下,大部分的请求还是打到了我的数据库,如图所示

这种情况下,如果订单系统的请求量非常大,那对我们预约的系统压力以及数据库的压力会比较大,那么我们将如何解决我们的系统压力以及数据库的压力呢?

三、解决方案

刚才说到,订单系统有大量的订单,但是不是每个订单都需要预约,大部分单号对预约系统来说都是无效的请求,所以这个业务场景我们就可以考虑用布隆过滤器对无效的请求进行过滤。

具体怎么做呢,我们可以在数据库和预约系统之间增加布隆过滤器,增加了布隆过滤器那同时也必须增加布隆过滤器的数据初始化。我们可以这样设计,如下图所示

  • 在数据流入的时候增加布隆布隆过滤器的写入

        关键代码:BloomFilterUtils.addValue

/*** @author chen* @description 下单后处理* @param orderNo 订单号* @date: 2024/3/3 9:42*/private void afterOrderHandle(String orderNo) {//redisTemplate.opsForValue().setBit("test-key",10,true);//通过这种方式实现,需要自己使用hash算法计算对应位数组下标位置(不推荐)//推荐使用redisson开箱即用的RBloomFilter//加载到布隆过滤器BloomFilterUtils.addValue(BloomFilterEnum.TB_ORDER_BLOOM_FILTER.getBloomFilterName(),orderNo);log.info("#加载完毕#");//其他操作.....}
  • 在下游订单系统查询预约系统时增加通过订单号查询布隆过滤器进行过滤,能够快速的对上游请求进行快速过滤

关键代码:BloomFilterUtils.isContains

/*** @author chen* @description 订单查询* @param reqVO 请求入参* @date: 2024/3/3 9:59* @return com.redis.bloom.filter.data.vo.resp.OrderSearchRespVO*/public OrderSearchRespVO orderSearch(OrderSearchReqVO reqVO) {String orderNo = reqVO.getOrderNo();if(!BloomFilterUtils.isContains(BloomFilterEnum.TB_ORDER_BLOOM_FILTER.getBloomFilterName(),orderNo)){log.info("布隆过滤器不存在#则代表数据库一定不存在,则直接返回空,不进行数据库查询#orderNo={}",reqVO.getOrderNo());return null;}QueryWrapper<TbOrder> queryWrapper = new QueryWrapper<>();queryWrapper.eq("order_no",reqVO.getOrderNo());//查询数据库List<TbOrder> tbOrders = tbOrderMapper.selectList(queryWrapper);if(CollectionUtil.isEmpty(tbOrders)){return null;}TbOrder tbOrder = tbOrders.get(0);//使用MapStruct复制对象返回,不暴漏数据库对象给前端OrderSearchRespVO respVO = TbOrderCopyMapper.INSTANCE.createOrderSearchRespVO(tbOrder);return respVO;}

四、总结

  • 针对此场景、布隆过滤器有着小而实用的特点,可以利用较小的内存挡住大部分的请求,从而降低系统压力和数据库压力
  • 布隆过滤器不仅针对此场景有使用的地方,同时也可以针对缓存穿透也是有很大用处,大大降低数据库的压力
  • 这里仅仅只是记录了布隆过滤器特定场景,目前也是我在工作中用的最多的场景,优化效果显著

五、源代码

redis-bloom-filter: 1、这里介绍了简单的布隆过滤器的用法以及实战场景

感兴趣的朋友可以拉下代码进行项目运行,只需要把redis配置更换即可

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

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

相关文章

termux上安装Python

Termux是一款Android平台下的终端模拟器和Linux环境应用&#xff0c;它允许用户在移动设备上访问Linux命令行界面&#xff0c;以便使用命令行工具、脚本、开发环境等功能。 要在Termux上安装Python&#xff0c;请按照以下步骤进行操作&#xff1a; 一&#xff0c;下载termux …

温湿度传感器SHT21

SHT21是一款基于IIC的温湿度传感器&#xff0c;它的引脚及定义如下&#xff1a; 标准的IIC器件&#xff0c;没有其他多余的引脚&#xff0c;应用框图如下&#xff1a; 温度的测量范围是-40到125℃&#xff0c;湿度测量范围0-100%RH&#xff0c;具体参数及采样精度见下图&#x…

如何限制一个账号只在一处登陆

大家好&#xff0c;我是广漂程序员DevinRock&#xff01; 1. 需求分析 前阵子&#xff0c;和问答群里一个前端朋友&#xff0c;随便唠了唠。期间他问了我一个问题&#xff0c;让我印象深刻。 他问的是&#xff0c;限制同一账号只能在一处设备上登录&#xff0c;是如何实现的…

C语言操作符详解(一)

一、操作符的分类 • 算术操作符&#xff1a; 、- 、* 、/ 、% • 移位操作符:<< >> • 位操作符: & | ^ • 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^ • 单⽬操作符&#xff1a; &#xff01;、、--、&、*、、…

嵌入式基础知识-信号量,PV原语与前趋图

本篇来介绍信号量与PV原语的一些知识&#xff0c;并介绍其在前趋图上的应用分析。本篇的知识属于操作系统部分的通用知识&#xff0c;在嵌入式软件开发中&#xff0c;同样会用到这些知识。 1 信号量 信号量是最早出现的用来解决进程同步与互斥问题的机制&#xff08;可以把信…

深入了解 Android 中的 FrameLayout 布局

FrameLayout 是 Android 中常用的布局之一&#xff0c;它允许子视图堆叠在一起&#xff0c;可以在不同位置放置子视图。在这篇博客中&#xff0c;我们将详细介绍 FrameLayout 的属性及其作用。 <FrameLayout xmlns:android"http://schemas.android.com/apk/res/androi…

计算机组成原理(超详解!!) 第一节 导论

1.计算机的性能指标 1.字长 一般大型计算机字长为32位或64位&#xff1b; 小型计算机字长为16位或32位&#xff1b;微型计算机字长有1位、4位、8位、16位&#xff1b; 高档微型计算机字长为32位和64位。对于字长短的计算机&#xff0c;为了提高计算精度&#xff0c;采用多字…

基于SSM的农业电商服务系统(农产品销售管理系统)(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的农业电商服务系统&#xff08;农产品销售管理系统&#xff09;&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#…

可视化大屏实现屏幕自适应和自动全屏的实现

前言 在可视化大屏项目中&#xff0c;屏幕适配是绕不过去的一个问题&#xff08;ps&#xff1a;如果知道大屏展示的屏幕是固定的&#xff0c;当我没说&#xff09;。这里简单介绍通过 css的transform属性 里面的 scal() 实现常规屏幕适配。 常规屏幕&#xff1a; 1366 * 768…

【蓝桥备赛】双指针

日志统计 双指针在算法中也是经常会用到的&#xff0c;比如原地交换数组中的元素就可以用双指针来做&#xff0c;但是有的时候可能看不出来是双指针的思想。 对于一对数字可以用pair类型&#xff0c;cnt表示类型的次数&#xff0c;bool数组表示当前是否符合大于等于k的条件。 …

Vue.js+SpringBoot开发高校实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

Unity游戏输入系统(新版+旧版)

使用新版还是旧版 旧版 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c5 : MonoBehaviour {void Start(){}void Update(){// 注意要在游戏中 点鼠标键盘进行测试// 鼠标// 0左键 1右键 2滚轮if (Input.GetMouseButtonDown(0)…

【千字总结】爬虫学习指南-2024最新版

介绍 如何自学爬虫&#xff1f;今天有一个兄弟这样问我&#xff0c;可以看到打了很多字&#xff0c;诚意肯定是很足的&#xff0c;也是对我的内容给予了肯定&#xff0c;让我非常的开心。既然难得有人问我&#xff0c;那我一定要好好做一个回答。 我下面将要说的内容没有任何话…

【Maven】Maven 基础教程(四):搭建 Maven 私服 Nexus

《Maven 基础教程》系列&#xff0c;包含以下 4 篇文章&#xff1a; Maven 基础教程&#xff08;一&#xff09;&#xff1a;基础介绍、开发环境配置Maven 基础教程&#xff08;二&#xff09;&#xff1a;Maven 的使用Maven 基础教程&#xff08;三&#xff09;&#xff1a;b…

数据迁移DTS | 云上MySQL 数据库迁移至达梦数据库

引入 云上 MySQL 数据库 —> 向达梦国产化数据库迁移 下载&安装 达梦客户端工具 DM->可参考之前国产化专栏达梦文章 创建模式 在客户端分别依次执行以下命令脚本&#xff08;这里没有通过客户端管理工具去创建达梦数据库的模式&#xff0c;当然也可以通过图形化界…

YOLOv8独家原创改进:特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合YOLOv8,实现涨点。 将GELAN添加在backbone和head处,提供多个yaml改进方法 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现…

MySQL-----视图

一 视图 ▶ 介绍 视图view是一个虚拟表&#xff0c;非真实存在&#xff0c;其本质是根据SQL语句获取动态的数据集&#xff0c;并为其命名&#xff0c;用户使用时只需使用视图名称即可获取结果集&#xff0c;并可以将其当作表来使用。 数据库中存放了视图的定义&…

格两例12345

osu/Lucky Roll gaming 周末osu有道题&#xff1a;lcg已知低位 def lcg(s, a, b, p):return (a * s b) % pp getPrime(floor(72.7)) a randrange(0, p) b randrange(0, p) seed randrange(0, p) print(f"{p }") print(f"{a }") print(f"{b …

SketchUp Pro 2023:颠覆传统,重塑设计世界mac/win版

SketchUp Pro 2023是一款强大的三维建模软件&#xff0c;专为设计师、建筑师和创意专业人士打造。这款软件以其直观易用的界面和强大的功能而著称&#xff0c;为用户提供了无限的创意空间。 SketchUp Pro 2023 软件获取 SketchUp Pro 2023在用户体验方面进行了全面的优化&…

20240304-2-计算机网络

计算机网络 知识体系 Questions 1.计算机网络分层的优点和缺点 优点 各层之间是独立的&#xff1b;灵活性好&#xff1b;结构上可分割开&#xff1b;易于实现和维护&#xff1b;能促进标准化工作。 缺点&#xff1a; 降低效率&#xff1b;有些功能会在不同的层次中重复出现&…