当前位置: 首页 > news >正文

【C++】位图+布隆过滤器

1.位图

概念

所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的或是否被标记。

1.二进制位表示 :

位图中的每一位(bit)代表一个元素的状态。通常,1 表示元素存在或被标记,0 表示元素不存在或未被标记。

2.空间高效性 :

每个元素仅占用 1 比特的空间,相比其他数据结构存储数据最小也只是char类型占1字节8比特位,可见位图在存储空间上极为高效.

问题引入

面试题:

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。

分析:

1G
=1024MB
=1024x1024KB
=1024x 1024x1024Byte
=2^30Byte=10亿+Byte
40亿整数等于160亿Byte,约等于16个G左右

set等数据结构和排序方法不适用

因为内存占用过大,插入查找效率不高

运用位图解决:

位图用1位表示每个可能的整数是否存在。无符号整数范围是0到4,294,967,295个可能的值,位图需要约512MB内存(4,294,967,296位 ÷ 8 = 512MB),远小于 set 的内存需求,内存空间只需原来的1/8。
位图的查找操作是O(1)时间复杂度,通过简单的位运算即可判断一个数是否存在。

1.2位图的实现

复习位运算

基本操作:

1.与运算(AND)符号为 &
用于比较两个二进制数的每一位。只有当两个数的对应位都是1时,结果位才是1,否则为0。
2.或运算(OR)符号为 |
比较两个二进制数的每一位。只要两个数的对应位中有一个是1,结果位就是1,否则为0。
3.异或运算(XOR)符号为 ^
比较两个二进制数的每一位。只有当两个数的对应位不同时,结果位才是1,否则为0。
4.取反运算(NOT)符号为 ~
对一个二进制数的每一位取反。即把1变为0,0变为1。
5.左移运算(Left Shift)符号为 <<
将一个二进制数的各位向左移动指定的位数左边溢出的位被丢弃,右边空出的位用0填充。
6.右移运算(Right Shift)符号为 >>
将一个二进制数的各位向右移动指定的位数。右边溢出的位被丢弃,左边空出的位用0填充(对于无符号数)或用符号位填充(对于有符号数)
注意:左移是往高地址,右移往低地址,不是指方向

位运算的应用:

数据压缩 :通过位运算可以将多个布尔值或小整数打包到一个较大的数据类型中,从而节省空间。
标记状态 :使用位图来标记状态,如文件系统的磁盘块使用情况、内存管理中的页面使用情况等。
高效计算 :位运算在某些数学计算中非常高效,比如乘以除以2的幂次时,可以用左移右移运算代替乘法或除法。
并发编程 :在原子操作中,位运算可以用于实现锁和标志位等。

位运算的优势:

性能高效 :位运算在计算机底层硬件层面直接操作二进制位,通常比其他算术运算更快。
空间节省 :可以用较少的空间存储大量的二进制状态信息,如位图。

实现

  • bitset类模板
namespace ee
{template<size_t N>class bitset{public:bitset(){_a.resize(N / 32 + 1);}private:vector<int> _a;};
}

1.N 是一个非类型模板参数,是无符号整型,表示位集合中位的数量。
2.构造函数中,N / 32 计算出需要的完整整数数量。如果 N 不是32的倍数,则 N / 32 会向下取整,因此需要加1来确保有足够的空间存储所有位。最坏的情况是刚好整除,多了32个比特位
3.用vector _a;来存储位集合,每个集合可存储8个比特位
注意:位图开空间看的是数据的范围而不是个数,对于连续稠密的数据处理来说空间利用率很高效,处理稀疏数据可以采取哈希表或布隆过滤器等其他数据结构

  • 设置位状态
void set(size_t x)
{size_t i = x / 32;size_t j = x % 32;_a[i] |= (1 << j);
}

1.整除操作计算出x所在数组元素中索引位置i
2.取余操作计算出在数组元素中的偏移量j
3.更新位状态,将所有位左移j位,右边补0,进行或运算,确保j位置设为1

  • 重置位状态
void reset(size_t x)
{size_t i = x / 32;size_t j = x % 32;_a[i] &=( ~(1 << j));
}

1.作用:用于将位集合中指定位置的位设置为 0,表示该位置被清除或处于未激活状态。
2.~(1 << j) :生成一个掩码,其中只有第 j 位为 0,其余位为 1。然后将 _a[i] 的第 j 位设置为 0,其余位保持不变。

  • 检查位状态
bool test(size_t x)
{size_t i = x / 32;size_t j = x % 32;return _a[i] &(1 << j);
}

1.作用:用于检查位集合中指定位置的位是否为 1
2.1 << j :生成一个掩码,其中只有第 j 位为 1,其余位为 0。_a[i] & (1 << j) :通过按位与运算,如果 _a[i] 的第 j 位为 1,则结果非零(true);否则结果为零(false)。

处理负数

int main()
{int a1[] = { -1,2,3,3,4,4,4,4,4,2,3,6,3,1,5,5,8,9 };int a2[] = { -1,8,4,8,4,1,1,1,1 };ee::bitset<-1> bs1;ee::bitset<-1> bs2;// 去重 for (auto e : a1){bs1.set(e);}// 去重for (auto e : a2){bs2.set(e);}size_t x = -1;cout << x << endl;//寻找交集for (size_t i = 0; i < -1; i++){if (bs1.test(i) && bs2.test(i)){cout << i << " ";}}cout << endl;
}

用-1去开空间,会自动转为无符号整型即32位下每一位都是1,取值范围大概是42亿9千万。for循环中用i的值小于-1作为条件去遍历,同样会转成无符号整型。
注意:
32位系统下无符号整型是unsigned int占四字节大小,64位系统下是unsigned long long int占8字节大小,64位下占用空间太大系统可能开不出来

1.3位图的应用

3.1排序+去重

给定100亿个整数,涉及算法找到只出现一次的整数
思路:

在这里插入图片描述
两个位的标识总共4种情况,可以采取00表示不存在,01表示只存在一次,10表示存在多次的情况。找到只出现一次的整数就是找到01状态标识的位

  • 类模板twobitset
template<size_t N>
class twobitset
{
public:
public:void set(size_t x){//将位状态00标记为01if (!_bs1.test(x) && !_bs2.test(x)){_bs2.set(x);}//01->10else if (!_bs1.test(x) && _bs2.test(x)){_bs1.set(x);_bs2.reset(x);}//10代表两次以上,不用变了}bool is_once(size_t x){//返回标记状态为01的位return !_bs1.test(x) && _bs2.test(x);}
private:bitset<N> _bs1;bitset<N> _bs2;
};
``- 测试代码
```cpp
int main()
{int a[] = { 1,2,3,3,4,4,4,4,4,2,3,6,3,1,5,5,8,9 };ee::twobitset<10> tbs;//入数据for (auto e : a){tbs.set(e);}//遍历查找位状态位01的数据for (auto e : a){if (tbs.is_once(e)){cout << e << " ";}}cout << endl;return 0;
}

同理,若要查找次数不超过2,或者超过2的所有整数,可以通过标记位状态实现,总共00,01,10,11四种状态选择。任选三种,其中只需要标记两次状态,第三种状态默认不变,可参考上文例题。然后通过判断位状态函数返回的bool值确定即可。

3.2求两个集合的交集与并集

给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

错误思路:

一个文件所有值映射到一个位图,用另一个文件判断在不在出来的交集,需要再次去重

正确思路:

用twobitset类模板,将两个文件分别映射到两个位图,对应位置与一下,要是都为1,那么这个值就是交集

  • 测试代码
int main()
{int a1[] = { 1,2,3,3,4,4,4,4,4,2,3,6,3,1,5,5,8,9 };int a2[] = { 8,4,8,4,1,1,1,1 };ee::bitset<10> bs1;ee::bitset<10> bs2;// 去重for (auto e : a1){bs1.set(e);}// 去重for (auto e : a2){bs2.set(e);}//寻找交集for (int i = 0; i < 10; i++){if (bs1.test(i) && bs2.test(i)){cout << i << " ";}}cout << endl;
}

2.布隆过滤器

概念

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间

工作原理

插入操作:
当插入一个元素时,元素通过多个哈希函数映射到位数组的多个位置,这些位置被设置为1
查询操作:
当查询一个元素时,元素同样通过多个哈希函数映射到位数组的多个位置。如果所有这些位置都是1,则判断该元素存在于集合中;否则,判断该元素不存在于集合中。

性能分析

在这里插入图片描述
该图是误判率p在n和m一定关系下随k变化,可以看出k越多误判率确实越低,但并不是越多越好

布隆过滤器的长度(m)
布隆过滤器的长度指的是位数组的大小。较大的位数组可以降低误判率,但会增加空间使用。
哈希函数个数(k)
每个插入的元素都会被 k 个不同的哈希函数映射到位数组中。合适的哈希函数个数可以有效平衡误判率和空间效率。但过多的哈希函数会增加计算开销。
插入元素个数(n)
插入的元素越多,位数组中被设置为1的位就越多,误判率也会随之增加。
误判率(p):
误判发生在查询一个未插入的元素时,所有哈希函数映射的位刚好都是1。这种误判的概率与位数组的填充率密切相关。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在实际中通常用m和n来计算出k,然后m和n保持一定线性关系增长即可,上述公式位理想最优情况下的计算

2.1实现

哈希函数

根据k的计算公式选择几个哈希函数

struct BKDRHash
{size_t operator()(const string& str){size_t hash = 0;for (auto ch : str){hash = hash * 131 + ch;}//cout <<"BKDRHash:" << hash << endl;return hash;}
};struct APHash
{size_t operator()(const string& str){size_t hash = 0;for (size_t i = 0; i < str.size(); i++){size_t ch = str[i];if ((i & 1) == 0){hash ^= ((hash << 7) ^ ch ^ (hash >> 3));}else{hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));}}//cout << "APHash:" << hash << endl;return hash;}
};struct DJBHash
{size_t operator()(const string& str){size_t hash = 5381;for (auto ch : str){hash += (hash << 5) + ch;}//cout << "DJBHash:" << hash << endl;return hash;}
};

基本模板

template<size_t N,class K=string,class Hash1= BKDRHash,class Hash2 = APHash,class Hash3 = DJBHash>class BloomFilter
{
public:
private:ee::bitset<N> _bs;
};

设置位状态

void Set(const K& key)
{size_t hash1 = Hash1()(key) % N;_bs.set(hash1);size_t hash2 = Hash2()(key) % N;_bs.set(hash2);size_t hash3 = Hash3()(key) % N;_bs.set(hash3);
}

计算每个哈希函数映射的哈希值,然后调用set函数设置位状态。
Hash1()(key)中Hash1()创建了一个匿名对象(临时对象),调用该匿名对象的 operator() 方法,计算 key 的哈希值。

检查位状态

bool Test(const K& key)
{size_t hash1 = Hash1()(key) % N;if (_bs.test(hash1) == false)return false;size_t hash2 = Hash2()(key) % N;if (_bs.test(hash2) == false)return false;size_t hash3 = Hash3()(key) % N;if (_bs.test(hash3) == false)return false;return true;
}

每个数据映射的位中只要有一个状位态不为1就是不在。也可能导致误判,多个不同的元素可能通过哈希函数映射到相同的位置,导致这些位置被设置为1。

关于删除

布隆过滤器不能直接支持删除工作,因为在删除一个元素时,可能会影响其他元素。即该位的标记改变,可能影响其他元素在该位的映射

一种支持删除的方法:将布隆过滤器中的每个比特位扩展成一个小的计数器,插入元素时给k个计数器(k个哈希函数计算出的哈希地址)加一,删除元素时,给k个计数器减一,通过多占用几倍存储空间的代价来增加删除操作。

但其实这样是不值得的,因为布隆过滤器相比其他数据结构的最大优势就是插入和访问效率高,时间复杂度均为 O(k),其中 k 是哈希函数的个数。它的空间效率也极高,适用于需要处理大规模数据的场景。如果为了增加一个删除操作和丧失其最大优势有点得不偿失,一般不会用它来进行删除

  • 测试代码
void TestBloomFilter()
{BloomFilter<11> bf;bf.Set("孙悟空");bf.Set("猪八戒");bf.Set("牛魔王");bf.Set("二郎神");cout << bf.Test("孙悟空") << endl;cout << bf.Test("猪八戒") << endl;cout << bf.Test("沙悟净") << endl;cout << bf.Test("二郎神") << endl;
}

2.2性能测试

void TestBloomFilter2()
{srand(time(0));const size_t N = 100000;BloomFilter<N * 4> bf;std::vector<std::string> v1;//std::string url = "https://www.cnblogs.com/-clq/archive  ";std::string url = "猪八戒";for (size_t i = 0; i < N; ++i){v1.push_back(url + std::to_string(i));}for (auto& str : v1){bf.Set(str);}// v2跟v1是相似字符串集(前缀一样),但是不一样std::vector<std::string> v2;for (size_t i = 0; i < N; ++i){std::string urlstr = url;urlstr += std::to_string(9999999 + i);v2.push_back(urlstr);}size_t n2 = 0;for (auto& str : v2){if (bf.Test(str)) // 误判{++n2;}}cout << "相似字符串误判率:" << (double)n2 / (double)N << endl;// 不相似字符串集std::vector<std::string> v3;for (size_t i = 0; i < N; ++i){//string url = "zhihu.com";string url = "孙悟空";url += std::to_string(i + rand());v3.push_back(url);}size_t n3 = 0;for (auto& str : v3){if (bf.Test(str)){++n3;}}cout << "不相似字符串误判率:" << (double)n3 / (double)N << endl;
}

作用是测试布隆过滤器在处理相似字符串和不相似字符串时的误判率。
相似字符串误判率:由于相似字符串的前缀相同,可能更容易导致哈希冲突,因此误判率可能较高。
不相似字符串误判率:由于字符串完全不同,误判率可能较低。
同时在开的空间越大的情况下误判率越低

2.3总结

布隆过滤器优点

  1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关
  2. 哈希函数相互之间没有关系,方便硬件并行运算
  3. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势
  4. 在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势
  5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能
  6. 使用同一组散列函数的布隆过滤器可以进行交、并、差运算

布隆过滤器缺陷

  1. 有误判率,即存在假阳性(False Position),即不能准确判断元素是否在集合中(补救方法:再建立一个白名单,存储可能会误判的数据)
  2. 不能获取元素本身
  3. 一般情况下不能从布隆过滤器中删除元素
  4. 如果采用计数方式删除,可能会存在计数回绕问题

2.4海量数据题思路

哈希切割

  • 给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法

近似算法思路;

将一个文件放到布隆过滤器,用另一个去查找在不在,会存在误判情况

精确算法思路:哈希切割

在这里插入图片描述

  • 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?如何找到top K的IP?

1.进行哈希切分,相同ip一定进入了相同的小文件,进行切分后内存占用不大,用map去分别统计每个小文件中出现的次数即可
2.进行哈希切分,放入堆中,读出前k个最大的键小堆,反之建大堆

相关文章:

【C++】位图+布隆过滤器

1.位图 概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的或是否被标记。 1.二进制位表示 &#xff1a; 位图中的每一位&#xff08;bit&#xff09;代表一个元素的状态。通常&…...

Google Agent Development Kit与MCP初试

Google Agent Development Kit与MCP初试 一、背景知识二、搭建智能大脑 - Ollama服务器2.1 为什么要先搭建Ollama&#xff1f;2.2 搭建ollama服务器2.2.1 安装2.2.2 试着用curl命令"问"AI一个问题&#xff1a; 三、构建智能体工坊 - ADK环境3.1 创建容器3.2 安装核心…...

云原生+大数据

虚拟化&#xff1a; 虚拟化&#xff0c;是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机&#xff0c;每个逻辑计算机可运行不同的操作系统&#xff0c;并且应用程序都可以在相互独立的空间内运行而互不影响&#xff0c;从而显著提…...

基于cornerstone3D的dicom影像浏览器 第二十一章 显示DICOM TAGS

系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png&#xff0c;显示检查栏&#xff0c;序列栏 第六章 stack viewport 显…...

【记录】PPT|PPT打开开发工具并支持Quicker VBA运行

文章目录 打开开发者工具支持Quicker VBA运行 打开开发者工具 参考文章&#xff0c;微软文档&#xff1a;显示“开发工具”选项卡&#xff0c;以下直接复制&#xff0c;如侵私删。 适用对象&#xff1a;Microsoft 365 专属 Excel Microsoft 365 专属 Outlook Microsoft 365 专属…...

西门子 S1500 博途软件舞台威亚 3D 控制方案

西门子 S1500 PLC 是工业自动化领域的主流控制器&#xff0c;适合高精度、高可靠性的舞台威亚控制。下面为你提供基于博途 (TIA Portal) 软件的 3D 控制方案设计。 系统架构设计 舞台威亚 3D 控制系统通常包含以下组件&#xff1a; 硬件层&#xff1a; S1500 PLC 主机伺服驱动…...

第三十二天打卡

import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # 加载鸢尾花数据集 iris load_iris() df pd.DataFrame(iris.data, columnsiris.feature_names) …...

同步/异步电路;同步/异步复位

同步/异步电路&#xff1b;同步/异步复位 在 FPGA 设计中&#xff0c;同步电路、异步电路、同步复位和异步复位是基础且关键的概念&#xff0c;它们的特性直接影响电路的可靠性、时序性能和设计复杂度。 一、同步电路&#xff08;Synchronous Circuit&#xff09; 定义 同步电…...

spring boot 实现resp视频推流

1、搭建resp服务&#xff08;docker方式&#xff09; docker pull aler9/rtsp-simple-serverdocker run -d --restartalways \--name rtsp-server \-p 8554:8554 \aler9/rtsp-simple-server2、maven依赖 <dependency><groupId>org.bytedeco</groupId><a…...

python、R、shell兼容1

一&#xff0c;兼容方式 1&#xff0c;shell中用R、python&#xff1a; &#xff08;1&#xff09;python3、R/r&#xff08;radian&#xff09;进入 &#xff08;2&#xff09;脚本封装&#xff1a;命令行或者封装到sh脚本中 python xxx.py 自定义参数 Rscript xxx.r 自…...

Oracle 11G RAC重启系统异常

vmware安装centos7环境部署Oracle RAC (11.2.0.4) 部署时所有资源情况都是正常的&#xff0c;关机重启虚拟机后集群资源状态异常&#xff0c;请教CSDN大佬 – 部署规划 域名地址备注rac16192.168.31.16rac17192.168.31.17rac16vip192.168.31.26viprac17vip192.168.31.27vip…...

便捷的电脑自动关机辅助工具

软件介绍 本文介绍的软件是一款电脑上实用的倒计时和关机助手。 软件特性 这款关机助手十分贴心&#xff0c;它是一款无需安装的小软件&#xff0c;体积仅60KB&#xff0c;不用担心占用电脑空间&#xff0c;打开即可直接使用。 操作方法 你只需设置好对应的关机时间&#x…...

巧用 FFmpeg 命令行合并多个视频为一个视频文件教程

你是否曾经遇到过需要将多个视频片段合并成一个连续视频的情况&#xff1f;比如&#xff0c;你拍摄了一段旅行的精彩瞬间&#xff0c;想把它们合成一部短片&#xff1b;或者你在制作教学视频时&#xff0c;希望将不同的部分整合在一起。这时候&#xff0c;FFmpeg 就是你的得力助…...

平时使用电脑,如何去维护

在这个数字化的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;你是否知道如何正确地维护它&#xff0c;让它始终保持良好的运行状态呢&#xff1f;今天&#xff0c;就让我来为大家揭晓这个谜底。定期清理电脑内部和外部的灰尘是至关重要的。…...

(视觉)分类、检测与分割在不同网络中的设计体现

分类、检测与分割在不同网络中的设计体现 概述 在计算机视觉领域&#xff0c;不同的网络结构在功能和结构上差异显著&#xff0c;同时也共享一些基础设计元素。 卷积神经网络是基石&#xff1a; 卷积层通过特定的卷积核与图像进行卷积运算提取图像中的局部特征&#xff0c;比…...

技术分享 | MySQL大事务导致数据库卡顿

本文为墨天轮数据库管理服务团队第66期技术分享&#xff0c;内容原创&#xff0c;作者为技术顾问孙文龙&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、现 象 业务侧反馈连接数据库异常&#xff0c;报错 connection is not av…...

C#在 .NET 9.0 中启用二进制序列化:配置、风险与替代方案

在 .NET 9.0 中启用二进制序列化&#xff1a;配置、风险与替代方案 引言一、启用二进制序列化的步骤二、实现序列化与反序列化三、安全风险与缓解措施四、推荐替代方案五、总结 引言 在 .NET 生态中&#xff0c;二进制序列化&#xff08;Binary Serialization&#xff09;曾是…...

每日Prompt:像素风格插画

提示词 像素风格插画&#xff0c;日式漫画脸&#xff0c;画面主体为一位站在路边的男孩&#xff0c;人物穿着黑色冲锋衣&#xff0c;手里拿着手机&#xff0c;男孩靠坐在机车旁边&#xff0c;脚边依偎着一只带着小摩托车头盔的小小猫&#xff0c;背景是雨中&#xff0c;身旁停…...

Rust 学习笔记:生命周期

Rust 学习笔记&#xff1a;生命周期 Rust 学习笔记&#xff1a;生命周期使用生命周期防止悬空引用借用检查器函数中的泛型生命周期生命周期注释语法函数签名中的生命周期注解从生命周期的角度思考结构定义中的生命周期注解省略生命周期方法定义中的生命周期注释静态生命周期泛型…...

科学标注法:数据治理的未来之路

在数据治理领域,科学标注法是一种系统化、标准化的数据标注方法论,其核心是通过规范化的流程、技术工具和质量控制机制,将原始数据转化为具有语义和结构特征的可用数据资源。以下从定义、技术特征、应用场景、与传统标注方法的区别以及遵循的标准框架等方面展开详细解析: 一…...

小白刷题 之 如何高效计算二进制数组中最大连续 1 的个数

前言 学习如何快速找出二进制数组中最长的连续 1 序列。 这个问题在数据处理、网络传输和算法面试中经常出现&#xff0c;掌握它不仅能提升编程能力&#xff0c;还能加深对数组操作和循环控制的理解。 &#x1f31f; 问题背景 想象你是一位网络工程师&#xff0c;正在分析服…...

中科方德鸳鸯火锅平台使用教程:轻松运行Windows应用!

原文链接&#xff1a;中科方德鸳鸯火锅平台使用教程&#xff1a;轻松运行Windows应用&#xff01; Hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇中科方德鸳鸯火锅平台使用的文章&#xff0c;欢迎大家分享点赞&#xff0c;点个在看和关注吧&#xff01;在信创环境…...

完全禁用 Actuator 功能

问题描述&#xff1a; springboot 关闭Actuator无效&#xff0c;原本设置 management:endpoints:enabled-by-default: false # 禁用所有端点屏蔽了/actuator/info和/actuator/health&#xff0c;但/actuator还可以访问。 拉满配置如下&#xff0c;成功屏蔽 # application.y…...

Netty学习专栏(二):Netty快速入门及重要组件详解(EventLoop、Channel、ChannelPipeline)

文章目录 前言一、快速入门&#xff1a;5分钟搭建Echo服务器二、核心组件深度解析2.1 EventLoop&#xff1a;颠覆性的线程模型EventLoop 设计原理核心 API 详解代码实践&#xff1a;完整使用示例 2.2 Channel&#xff1a;统一的网络抽象层Channel 核心架构核心 API 详解代码实践…...

27-FreeRTOS的任务管理

一、FreeRTOS的任务概念 在FreeRTOS中&#xff0c;任务&#xff08;Task&#xff09;是操作系统调度的基本单位。每个任务都是一个无限循环的函数&#xff0c;它执行特定的功能。任务可以被看作是一个轻量级的线程&#xff0c;具有自己的堆栈和优先级。下面是如何定义一个任务函…...

upload-labs靶场通关详解:第14关

一、分析源代码 这一关的任务说明已经相当于给出了答案&#xff0c;就是让我们上传一个图片木马&#xff0c;可以理解为图片中包含了一段木马代码。 function getReailFileType($filename){$file fopen($filename, "rb");$bin fread($file, 2); //只读2字节fclose…...

supervisor的进程监控+prometheus+alertmanager实现告警

supervisor服务进程监控实现告警 前提&#xff1a;部署了prometheus(配置了rules文件夹),alertmanager,webhook,python3环境 [roottest supervisor_prometheus]# pwd /opt/supervisor_prometheus [roottest supervisor_prometheus]# ls supervisor_exporter.py supervisor_int…...

HarmonyOS 鸿蒙应用开发基础:父组件调用子组件方法的几种实现方案对比

在ArkUI声明式UI框架中&#xff0c;父组件无法直接调用子组件的方法。本文介绍几种优雅的解决方案&#xff0c;并作出对比分析&#xff0c;分析其适用于不同场景和版本需求。帮助开发者在开发中合理的选择和使用。 方案一&#xff1a;Watch装饰器&#xff08;V1版本适用&#x…...

Enhancing Relation Extractionvia Supervised Rationale Verifcation and Feedback

Enhancing Relation Extraction via Supervised Rationale Verification and Feedback| Proceedings of the AAAI Conference on Artificial Intelligencehttps://ojs.aaai.org/index.php/AAAI/article/view/34631 1. 概述 关系抽取(RE)任务旨在抽取文本中实体之间的语义关...

等离子体隐身技术和小型等离子体防御装置设计

相信大家前不久都看到了关于国防科大团队关于等离子体防御的相关文章&#xff0c;恰好也在做相关的研究&#xff0c;所以想向对这个问题感兴趣的朋友聊一聊这里面的一些基本原理和研究现状。 等离子体与电磁波的相互作用 等离子体会对电磁波产生吸收和反射作用&#xff0c;通常…...

PCB设计教程【入门篇】——电路分析基础-电路定理

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 一、电路基本概念 连接线与节点 …...

C++-继承

1.继承的概念及定义 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的层…...

25.5.22学习总结

ST表&#xff08;Sparse Table&#xff0c;稀疏表&#xff09;是一种用于高效解决静态区间最值查询&#xff08;RMQ&#xff09;问题的数据结构。其核心思想是通过预处理每个长度为2^j的区间的最值&#xff0c;使得查询时只需合并两个子区间的最值即可得到结果&#xff0c;从而…...

接口自动化测试框架(pytest+allure+aiohttp+ 用例自动生成)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 近期准备优先做接口测试的覆盖&#xff0c;为此需要开发一个测试框架&#xff0c;经过思考&#xff0c;这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的…...

FastAPI在 Nginx 和 Docker 环境中的部署

目录 实现示例1. 项目结构2. FastAPI 应用 (app/main.py)3. 依赖文件 (app/requirements.txt)4. Dockerfile5. Nginx 配置 (nginx/nginx.conf)6. Docker Compose 配置 (docker-compose.yml) 使用方法修改代码后更新 实现示例 接下来创建一个简单的示例项目&#xff0c;展示如何…...

08 接口自动化-用例管理框架pytest之fixtrue,conftest.py,allure报告以及logo定制

文章目录 一、使用fixture实现部分前后置1.function级别:在每个函数的前后执行2.class级别&#xff1a;在每个类的前后执行一次3.module级别&#xff1a;在每个模块的前后执行一次4.package、session级别&#xff0c;一般是和connftest.py文件一起使用 二、当fixture的级别为pa…...

Appium+python自动化(二)- 环境搭建—下

简介 我这里已经将android的测试开发环境已经搭建准备完毕。上一篇android测试开发环境已经准备好&#xff0c; 那么接下来就是appium的环境安装和搭建了。 搭建环境安装过程中切勿浮躁&#xff0c;静下心来一个一个慢慢地按照步骤一个个来。 环境装好后&#xff0c;可以用真机…...

浅谈测试驱动开发TDD

目录 1.什么是TDD 2.TDD步骤 3.TDD 的核心原则 4.TDD 与传统开发的对比 5.TDD中的单元测试和集成测试区别 6.总结 1.什么是TDD 测试驱动开发&#xff08;Test-Driven Development&#xff0c;简称 TDD&#xff09; 是一种软件开发方法论&#xff0c;核心思想是 “先写测试…...

MVC和MVVM架构的区别

MVC和MVVM都是前端开发中常用的设计模式&#xff0c;都是为了解决前端开发中的复杂性而设计的&#xff0c;而MVVM模式则是一种基于MVC模式的新模式。 MVC(Model-View-Controller)的三个核心部分&#xff1a;模型、视图、控制器相较于MVVM(Model-View-ViewModel)的三个核心部分…...

网络安全-等级保护(等保) 3-1-1 GB/T 28448-2019 附录A (资料性附录)测评力度附录C(规范性附录)测评单元编号说明

附录A (资料性附录)测评力度 A.1 概述 测评力度是在等级测评过程中实施测评工作的力度&#xff0c;体现为测评工作的实际投入程度&#xff0c;具体由测评的广度和深度来反映。测评广度越大&#xff0c;测评实施的范围越大&#xff0c;测评实施包含的测评对象就越多。测评深度…...

MySQL 可观测性最佳实践

MySQL 简介 MySQL 是一个广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其高性能、可靠性和易用性而闻名&#xff0c;适用于各种规模的应用&#xff0c;从小型网站到大型企业级系统。 监控 MySQL 指标是维护数据库健康、优化性能和确保数据…...

深入解析Spring Boot与Redis集成:高效缓存与性能优化

深入解析Spring Boot与Redis集成&#xff1a;高效缓存与性能优化 引言 在现代Web应用中&#xff0c;缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的内存数据库&#xff0c;广泛应用于缓存、会话管理和消息队列等场景。本文将详细介绍如何在Spring Boot项目中集…...

《C 语言字符串操作从入门到实战(下篇):strncpy/strncat/strstr 等函数原理与实现》

目录 七. strncpy函数的使用与模拟实现 7.1 strncpy函数理解 7.2 strncpy函数使用示例 7.3 strncpy函数模拟实现 八. strncat函数的使用与模拟实现 8.1 strncat函数理解 8.2 strncat函数使用示例 8.3 strncat函数模拟实现 九. strncmp函数的使用 9.1 strncmp函数理…...

百度智能云千帆AppBuilder RAG流程技术文档

一、概述 本文档旨在详细阐述百度智能云千帆AppBuilder的RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;流程&#xff0c;包括API对接、知识库维护以及文档资料管理等关键环节。通过本流程&#xff0c;开发者可以高效地构建基于大模型的…...

程序编辑器快捷键总结

程序编辑器快捷键总结 函数跳转 函数跳转 Creator : F2VSCode : F12visual Studio : F12...

MySQL中实现大数据量的快速插入

一、SQL语句优化​ 1. ​批量插入代替单条插入​ ​单条插入会频繁触发事务提交和日志写入&#xff0c;效率极低。​批量插入通过合并多条数据为一条SQL语句&#xff0c;减少网络传输和SQL解析开销。 -- 低效写法&#xff1a;逐条插入 INSERT INTO table (col1, col2) VALUE…...

从零基础到最佳实践:Vue.js 系列(8/10):《性能优化与最佳实践》

引言 Vue.js 是一个轻量、灵活且易于上手的现代前端框架&#xff0c;因其响应式数据绑定和组件化开发而广受欢迎。然而&#xff0c;随着项目规模的增长&#xff0c;性能问题逐渐显现&#xff0c;例如首屏加载缓慢、页面渲染卡顿、内存占用过高等。性能优化不仅能提升用户体验&…...

欧拉降幂(JAVA)蓝桥杯乘积幂次

这个题可以使用欧拉降幂&#xff0c;1000000007是质数&#xff0c;所以欧拉函数值为1000000006. import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System…...

Mysql的MVCC机制

MySQL的MVCC机制主要通过以下几个关键要素来工作&#xff1a; 数据版本与隐藏列 - MySQL InnoDB存储引擎会在每行数据中添加几个隐藏列&#xff0c;用于实现MVCC。其中包括 DB_TRX_ID 列&#xff0c;记录最后一次修改该行数据的事务ID&#xff1b; DB_ROLL_PTR 列&#xff…...

spring中的BeanFactoryAware接口详解

一、接口定义与核心作用 BeanFactoryAware 是 Spring 框架提供的一个回调接口&#xff0c;允许 Bean 在初始化阶段获取其所属的 BeanFactory 实例。该接口定义如下&#xff1a; public interface BeanFactoryAware {void setBeanFactory(BeanFactory beanFactory) throws Bea…...