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

Hbase应用案例 随机号码生成

Hbase应用案例1 随机号码生成

在Hbase中插入如下格式的数据,数据内容随机生成

名称示例说明
phonenumber158+randomrowkey,号码
dnum199+randomcolumn,另一位通话者
lengthrandomcolumn,时长
valuerandomcolumn,接收或拨打
daterandomcolumn,通话日期

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.hbase</groupId><artifactId>datain</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies><build><plugins><plugin><!--声明--><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><!--具体配置--><configuration><archive><manifest><!--jar包的执行入口--><mainClass>org.wunaiieq.datain</mainClass></manifest></archive><descriptorRefs><!--描述符,此处为预定义的,表示创建一个包含项目所有依赖的可执行 JAR 文件;允许自定义生成jar文件内容--><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><!--执行配置--><executions><execution><!--执行配置ID,可修改--><id>make-assembly</id><!--执行的生命周期--><phase>package</phase><goals><!--执行的目标,single表示创建一个分发包--><goal>single</goal></goals></execution></executions></plugin></plugins></build></project>

datain
主类,在内部执行插入并生成相应的数据

package org.wunaiieq;import org.apache.hadoop.hbase.client.Put;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;public class datain {public static Random random=new Random();public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static String getPhone(String prefix) {return prefix + String.format("%08d", random.nextInt(99999999));}private static String getData(int year) {Calendar calendar = Calendar.getInstance();calendar.set(year, 0, 1);calendar.add(Calendar.MONTH, random.nextInt(12));calendar.add(Calendar.DAY_OF_MONTH, random.nextInt(31));calendar.add(Calendar.HOUR_OF_DAY, random.nextInt(12));Date time = calendar.getTime();return simpleDateFormat.format(time);}public static void main(String[] args) throws Exception {//10个用户for (int i = 0; i < 10; i++) {String phonenumber = getPhone("158");for (int j = 0; j < 1000; j++) {String dnum = getPhone("199");int length = random.nextInt(200) + 1;int type = random.nextInt(2);String date = getData(2050);String rowkey = phonenumber + "_" + (Long.MAX_VALUE - simpleDateFormat.parse(date).getTime()) + i + j;HbaseDML.putCell("wunaiieq", "phone_log", rowkey, "basic", "dnum", dnum);HbaseDML.putCell("wunaiieq", "phone_log", rowkey, "basic", "length", String.valueOf(length));HbaseDML.putCell("wunaiieq", "phone_log", rowkey, "basic", "type", String.valueOf(type));HbaseDML.putCell("wunaiieq", "phone_log", rowkey, "basic", "date", date);}}}}

HbaseDML
DML操作集合,后续可以修改为service类
部分方法后缀+0表示公共方法,以便于对外访问

package org.wunaiieq;import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;public class HbaseDML {public static Connection connection = HBaseConnection.connection;/*** 向指定的HBase表中插入一个单元格数据。** @param namespace    命名空间,HBase中用于组织表的逻辑分组。* @param tableName    表名,HBase中的表标识。* @param rowKey       行键,用于唯一标识表中的一行。* @param columnFamily 列族名,HBase表中列的分组。* @param columnName   列名,列族下的具体列。* @param value        要插入的单元格值。* @throws IOException 如果与HBase的通信出现问题或插入数据时发生错误,将抛出此异常。*/public static void putCell(String namespace, String tableName, String rowKey,String columnFamily, String columnName, String value) throws IOException {// 获取HBase连接中的指定表Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个Put对象,用于存储要插入的行数据Put put = new Put(Bytes.toBytes(rowKey));// 向Put对象中添加列族、列名和对应的值put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName), Bytes.toBytes(value));// 尝试将Put对象写入HBase表try {table.put(put);} catch (IOException e) {// 如果发生IO异常,将其封装为RuntimeException并抛出throw new RuntimeException("Failed to put cell data to HBase table", e);}// 关闭表连接,释放资源table.close();}public static void putCell0(String namespace, String tableName, String rowKey,String columnFamily, String columnName, String value,Connection connect) throws IOException {// 获取HBase连接中的指定表Table table = connect.getTable(TableName.valueOf(namespace, tableName));// 创建一个Put对象,用于存储要插入的行数据Put put = new Put(Bytes.toBytes(rowKey));// 向Put对象中添加列族、列名和对应的值put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName), Bytes.toBytes(value));// 尝试将Put对象写入HBase表try {table.put(put);} catch (IOException e) {// 如果发生IO异常,将其封装为RuntimeException并抛出throw new RuntimeException("Failed to put cell data to HBase table", e);}// 关闭表连接,释放资源table.close();}/*** 从HBase表中获取指定行与列的数据。** @param namespace    命名空间,用于在HBase中逻辑上组织表。* @param tableName    表名,标识HBase中的具体表。* @param rowKey       行键,唯一标识表中的一行数据。* @param columnFamily 列族名,表示HBase表中列的分组。* @param columnName   列名,在指定列族下的具体列。* @throws IOException 若与HBase通信出错或数据检索失败,则抛出此异常。*/public static void getCells(String namespace, String tableName, String rowKey,String columnFamily, String columnName) throws IOException {// 根据命名空间和表名获取HBase连接中的对应表Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个Get对象,用于指定要检索的行数据Get get = new Get(Bytes.toBytes(rowKey));// 添加要检索的列族与列名get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));// 设置读取所有版本的数据(若表启用了版本控制)// 注:检查HBase的设置,如果VERSIONS,设置为1,这意味着HBase将只保留该列族中每个单元格的最新版本。get.readAllVersions();try {// 执行Get操作,从表中检索数据,并得到Result对象Result result = table.get(get);// 从Result对象中提取原始单元格数据Cell[] cells = result.rawCells();// 遍历并处理检索到的单元格数据for (Cell cell : cells) {// 使用CellUtil工具类从单元格中提取值,并转换为字符串String value = new String(CellUtil.cloneValue(cell));// 输出单元格值(实际应用中可能进行不同处理)System.out.println(value);}} catch (Exception e) {// 打印异常堆栈信息(生产环境中应进行更细致的错误处理)e.printStackTrace();}// 确保在方法结束时关闭表连接,释放资源table.close();}/*** 扫描HBase表中的行,并打印出每行中的单元格信息。** @param namespace 命名空间,HBase中表的命名空间,通常对应于数据库的概念。* @param tableName 表名,HBase中的表名。* @param startRow  扫描的起始行键,包含此行。* @param stopRow   扫描的停止行键,不包含此行(即扫描到stopRow之前的行)。* @throws IOException 如果与HBase的通信出现问题,则抛出此异常。*/public static void scanRows(String namespace, String tableName, String startRow, String stopRow) throws IOException {// 根据命名空间和表名获取HBase表的引用Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个新的扫描对象Scan scan = new Scan();// 设置扫描的起始行键(包含)scan.withStartRow(Bytes.toBytes(startRow));// 设置扫描的停止行键(不包含)scan.withStopRow(Bytes.toBytes(stopRow));try {// 获取扫描器,用于迭代表中的行ResultScanner scanner = table.getScanner(scan);// 迭代扫描器中的每个结果(即每行数据)for (Result result : scanner) {// 获取当前行的所有单元格Cell[] cells = result.rawCells();// 迭代当前行的每个单元格,并打印其信息for (Cell cell : cells) {System.out.print(// 单元格的行键new String(CellUtil.cloneRow(cell)) + "-" +// 单元格的列族new String(CellUtil.cloneFamily(cell)) + "-" +// 单元格的列限定符(即列名)new String(CellUtil.cloneQualifier(cell)) + "-" +// 单元格的值new String(CellUtil.cloneValue(cell)) + "\t");}// 打印完当前行的所有单元格后,换行System.out.println();}// 关闭扫描器,释放资源scanner.close();} catch (IOException e) {// 如果出现IO异常,打印堆栈跟踪e.printStackTrace();}// 关闭表的引用,释放资源table.close();}/*** 根据指定的命名空间、表名、起始行、结束行、列族、列名和值对HBase表进行过滤扫描。** @param namespace    HBase表的命名空间。* @param tableName    HBase表的名称。* @param startRow     扫描的起始行键(包含)。* @param stopRow      扫描的停止行键(不包含)。* @param columnFamily 要过滤的列族名称。* @param columnName   要过滤的列名。* @param value        用于过滤的值。* @throws IOException 如果与HBase的交互发生IO异常。*/public static void filterScan(String namespace, String tableName, String startRow, String stopRow, String columnFamily, String columnName, String value) throws IOException {// 根据命名空间和表名获取HBase表的引用Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个新的扫描对象Scan scan = new Scan();// 设置扫描的起始行键(包含)scan.withStartRow(Bytes.toBytes(startRow)); // 将字符串转换为字节数组// 设置扫描的停止行键(不包含)scan.withStopRow(Bytes.toBytes(stopRow)); // 将字符串转换为字节数组// 创建过滤器列表,可以添加多个过滤器FilterList filterList = new FilterList();// 创建过滤器:结果只保留当前列的数据,且列的值等于指定的值ColumnValueFilter columnValueFilter = new ColumnValueFilter(Bytes.toBytes(columnFamily), // 列族名转换为字节数组Bytes.toBytes(columnName), // 列名转换为字节数组CompareOperator.EQUAL, // 比较操作符:相等Bytes.toBytes(value) // 值转换为字节数组);// 创建过滤器:结果保留整行数据,但只有当指定列的值等于指定值时才返回该行// 注意:这与ColumnValueFilter不同,它不会过滤掉没有指定列的行SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), // 列族名转换为字节数组Bytes.toBytes(columnName), // 列名转换为字节数组CompareOperator.EQUAL, // 比较操作符:相等Bytes.toBytes(value) // 值转换为字节数组);// 将此过滤器加入到过滤器列表中// 注意:这里选择了singleColumnValueFilter,根据实际需求可以选择不同的过滤器filterList.addFilter(singleColumnValueFilter);// 添加过滤到扫描中scan.setFilter(filterList);try {// 获取扫描器,用于迭代表中的行ResultScanner scanner = table.getScanner(scan);// 迭代扫描器中的每个结果(即每行数据)for (Result result : scanner) {// 获取当前行的所有单元格Cell[] cells = result.rawCells();// 迭代当前行的每个单元格,并打印其信息for (Cell cell : cells) {System.out.print(// 单元格的行键new String(CellUtil.cloneRow(cell)) + "-" +// 单元格的列族new String(CellUtil.cloneFamily(cell)) + "-" +// 单元格的列限定符(即列名)new String(CellUtil.cloneQualifier(cell)) + "-" +// 单元格的值new String(CellUtil.cloneValue(cell)) + "\t");}// 打印完当前行的所有单元格后,换行System.out.println();}// 关闭扫描器,释放资源scanner.close();} catch (IOException e) {// 如果出现IO异常,打印堆栈跟踪e.printStackTrace();} finally {// 关闭表的引用,释放资源// 使用finally块确保表关闭,即使发生异常table.close();}}/*** 删除指定HBase表中特定行和列的数据。** @param namespace    表的命名空间(相当于数据库名)* @param tableName    表的名称* @param rowKey       行的键* @param columnFamily 列族名* @param columnName   列名* @throws IOException 如果操作过程中发生IO异常*/public static void deleteColumn(String namespace, String tableName, String rowKey, String columnFamily, String columnName) throws IOException {// 根据命名空间和表名获取HBase表对象Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个Delete对象,用于删除指定行的数据Delete delete = new Delete(Bytes.toBytes(rowKey));// 添加要删除的列信息(删除指定版本)// 注意:此行代码只会删除指定列的一个版本,如果没有特别指定版本号,实际上效果可能不明显delete.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));// 添加要删除的列信息(删除所有版本)// 此行代码会删除指定列的所有版本的数据delete.addColumns(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));try {// 执行删除操作table.delete(delete);} catch (IOException e) {// 如果删除过程中发生IO异常,抛出运行时异常throw new RuntimeException("删除数据时发生IO异常", e);}// 确保在操作结束后关闭表连接,释放资源table.close();}public static void main(String[] args) throws IOException {//插入单条数据//putCell("bigdata", "student", "20240924", "info", "job", "45");//读取数据//getCells("bigdata", "student", "20240924", "info", "job");//扫描//scanRows("bigdata","student","0","20240925");//filterScan("bigdata","student","0","999999999","info","name","zz");//删除//deleteColumn("bigdata", "student", "01", "info", "name");HBaseConnection.closeConnection();}}

HbaseConnection
连接类,没什么特殊说明

package org.wunaiieq;import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;public class HBaseConnection {public static Connection connection =null;//public static CompletableFuture<AsyncConnection> asyncConnectionCompletableFuture=null;static {//创建连接//默认使用同步连接try {//读取本地文件connection = ConnectionFactory.createConnection();} catch (IOException e) {e.printStackTrace();}//异步连接创建//asyncConnectionCompletableFuture= ConnectionFactory.createAsyncConnection();}public static void closeConnection() throws IOException {if(connection!=null){connection.close();}}public static void main(String[] args) throws IOException {//使用连接System.out.println(HBaseConnection.connection);//关闭连接HBaseConnection.closeConnection();}
}

hbase-site.xml
参考自己的配置文件

文件目录
画线去掉的表示用不到
在这里插入图片描述

相关文章:

Hbase应用案例 随机号码生成

Hbase应用案例1 随机号码生成 在Hbase中插入如下格式的数据&#xff0c;数据内容随机生成 名称示例说明phonenumber158randomrowkey&#xff0c;号码dnum199randomcolumn&#xff0c;另一位通话者lengthrandomcolumn&#xff0c;时长valuerandomcolumn&#xff0c;接收或拨打…...

论文阅读——量子退火Experimental signature of programmable quantum annealing

摘要&#xff1a;量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明&#xff0c;在理想化的封闭系统条件下&#xff0c;量子退火可以胜过基于经典热化的算法&#xff08;例如模拟退火&#xff09;。当前设计的量子退火装置的退相干时间比绝热演…...

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)

相信实验一大家已经完成了&#xff0c;对Arcgis已进一步熟悉了&#xff0c;现在开启第二个实验 ArcMap实验--网络分析 目录 ArcMap实验--网络分析 1.1 网络分析介绍 1.2 实验内容及目的 1.2.1 实验内容 1.2.2 实验目的 2.2 实验方案 2.3 实验流程 2.3.1 实验准备 2.3.2 空间校正…...

go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源

go Pool Pool用于展示如何使用有缓冲的通道实现资源池&#xff0c;来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况&#xff08;如共享数据库连接或者内存缓冲区&#xff09;下非 常有用。如果goroutine需要从池里得到这些资…...

mysql一个事务最少几次IO操作

事务的IO操作过程 开始事务&#xff1a;用户发起一个事务&#xff0c;例如执行START TRANSACTION;&#xff0c;此时事务开始。读取和修改数据&#xff1a;用户读取和修改数据时&#xff0c;InnoDB首先从Buffer Pool查找所需的数据页。如果数据页不在Buffer Pool中&#xff0c;…...

运输层总结

运输层协议&#xff1a;端到端协议 面向连接的传输控制协议 TCP无连接的用户数据报协议 UDP - 主要任务&#xff1a;为相 互通信的应用进程 提供 逻辑通信服务 - 屏蔽&#xff1a;运输层向高层用户 屏蔽 了下面网络核心的细节&#xff08;如网络拓扑、所采用 的路由选择协议等…...

【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

React 前端框架1

一、React 简介 &#xff08;一&#xff09;什么是 React React 是一个用于构建用户界面的 JavaScript 库&#xff0c;由 Facebook 开源并维护。它采用了组件化的开发思想&#xff0c;允许开发者将复杂的 UI 拆分成一个个独立、可复用的小组件&#xff0c;就如同搭积木一般&am…...

【真正离线安装】Adobe Flash Player 32.0.0.156 插件离线安装包下载(无需联网安装)

网上很多人声称并提供的flash离线安装包是需要联网才能安装成功的&#xff0c;其实就是在线安装包&#xff0c;而这里提供的是真正的离线安装包&#xff0c;无需联网即可安装成功。 点击下面地址下载离线安装包&#xff1a; Adobe Flash Player 32.0.0.156 for IE Adobe Fla…...

数据采集时,不同地区的动态IP数据质量有什么差异?

在数据采集的广阔世界中&#xff0c;动态IP扮演着至关重要的角色。它们不仅帮助我们突破地域限制&#xff0c;还能够提供多样化的数据来源。但是&#xff0c;不同地区的动态IP在数据质量上是否存在差异呢&#xff1f;本文将探讨这一问题&#xff0c;并为您提供实用的见解。 动…...

【Python爬虫五十个小案例】爬取猫眼电影Top100

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1f40d;引言 猫眼电影是国内知名的电影票务与资讯平台&#xff0c;其中Top100榜单是影迷和电影产业观察者关注的重点。通过爬取猫眼电影Top10…...

等保测评和 ISO27001 都是信息保护,区别是什么?

ISO27001 和等级保护&#xff08;等保&#xff09;都是信息安全领域重要的标准和制度&#xff0c;但它们在多个方面存在区别&#xff1a; 定义和性质 ISO27001 它是国际标准化组织&#xff08;ISO&#xff09;发布的信息安全管理体系标准&#xff0c;其目的是帮助组织建立、实…...

Linux系统编程之进程创建

概述 在Linux系统中&#xff0c;通过创建新的进程&#xff0c;我们可以实现多任务处理、并发执行和资源隔离等功能。创建进程的主要方法为&#xff1a;fork、vfork、clone。下面&#xff0c;我们将分别进行介绍。 fork fork是最常用的创建新进程的方法。当一个进程调用fork时&a…...

JAVA-IO

目录 IO流 一 字节流 1 FileOutStream 1 书写&#xff1a; 2 换行书写与续写&#xff1a; 2 FileInputStream 1 读取数据 2 循环读取&#xff1a; 二 字符流 1 FileReader 1 空参的read()方法读取数据&#xff1a; 2 有参的read()方法读取数据&#xff1a; 3 指定字…...

动态系统特征分析:特征向量、特征值、频率与阻尼比、参与因子计算方法

特征值和特征向量在动态系统分析中是核心工具&#xff0c;广泛用于电力系统小信号稳定性、机械系统模态分析等领域。以下详细介绍计算方法及应用。 1. 求解特征值与特征向量 对于一个 n n n\times n nn的系统矩阵 A A A&#xff1a; 右特征向量与特征值 特征值( λ \lambd…...

乐鑫发布 esp-iot-solution v2.0 版本

今天&#xff0c;乐鑫很高兴地宣布&#xff0c;esp-iot-solution v2.0 版本已经发布&#xff0c;release/v2.0 分支下的正式版本组件将为用户提供为期两年的 Bugfix 维护&#xff08;直到 2027.01.25 ESP-IDF v5.3 EOL&#xff09;。该版本将物联网开发中常用的功能进行了分类整…...

动态代理如何加强安全性

在当今这个信息爆炸、网络无孔不入的时代&#xff0c;我们的每一次点击、每一次浏览都可能留下痕迹&#xff0c;成为潜在的安全隐患。如何在享受网络便利的同时&#xff0c;有效保护自己的隐私和信息安全&#xff0c;成为了每位网络使用者必须面对的重要课题。动态代理服务器&a…...

Flutter 之 InheritedWidget

InheritedWidget 是 Flutter 框架中的一个重要类&#xff0c;用于在 Widget 树中共享数据。它是 Flutter 中数据传递和状态管理的基础之一。通过 InheritedWidget&#xff0c;你可以让子 Widget 在不需要显式传递数据的情况下&#xff0c;访问祖先 Widget 中的数据。这种机制对…...

AI 助力开发新篇章:云开发 Copilot 深度体验与技术解析

本文 一、引言&#xff1a;技术浪潮中的个人视角1.1 AI 和低代码的崛起1.2 为什么选择云开发 Copilot&#xff1f; 二、云开发 Copilot 的核心功能解析2.1 自然语言驱动的低代码开发2.1.1 自然语言输入示例2.1.2 代码生成的模块化支持 2.2 实时预览与调整2.2.1 实时预览窗口功能…...

MyBatis-Plus介绍及基本使用

文章目录 概述介绍MyBatis-Plus 常用配置分页插件配置类注解配置 快速入门maven 依赖编写配置文件编写启动类编写 MybatisPlus 配置类 代码生成器&#xff1a;MybatisPlusGeneratormaven依赖代码生成器核心类 概述 介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 M…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...