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

用Java写一个MVCC例子

MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库管理系统中处理并发访问数据的技术。它允许事务在查询时看到数据的一个快照版本,而不是直接查看最新的提交数据。这种方法不仅提高了并发性能,还减少了锁定带来的开销,因为读操作不会阻塞写操作,反之亦然。

代码基于Java21

Data:数据,对应一个数据库表

public class Data {String value;int DB_TRX_ID; // 记录的事务idData next; // 下一个版本public Data(String value, int DB_TRX_ID, Data next) {this.value = value;this.DB_TRX_ID = DB_TRX_ID;this.next = next;}@Overridepublic String toString() {return "Data{" +"value='" + value + '\'' +", DB_TRX_ID=" + DB_TRX_ID +", next=" + next +'}';}public String getValue() {return value;}public void setValue(String value) {this.value = value;}public int getDB_TRX_ID() {return DB_TRX_ID;}public void setDB_TRX_ID(int DB_TRX_ID) {this.DB_TRX_ID = DB_TRX_ID;}public Data getNext() {return next;}public void setNext(Data next) {this.next = next;}public static Data of(Data data) {return new Data(data.getValue(), data.getDB_TRX_ID(), data.getNext());}
}

Transaction:事务,具有ACID特性,事务每次修改数据时会生成一个数据版本(快照)

public class Transaction {private int id;private String state = "create";private IsolationLevel isolationLevel = REPEATABLE_READ;enum IsolationLevel {READ_COMMITTED, REPEATABLE_READ}public Transaction(int id) {this.id = id;}public void beginTransaction() {this.state = "begin";}public void commit() {this.state = "commit";}public IsolationLevel getIsolationLevel() {return isolationLevel;}public void setIsolationLevel(IsolationLevel isolationLevel) {this.isolationLevel = isolationLevel;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getState() {return state;}public void setState(String state) {this.state = state;}
}

ReadView:读视图,MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id

import java.util.Set;/*** m_ids:当前活跃的事务id集合* min_trx_id:当前活跃事务中最小的事务id* max_trx_id:系统将要分配给下一个事务的id* creator_trx_id:生成当前readview的事务id*/
public class ReadView {private Set<Integer> txs;private int min_trx_id;private int max_trx_id;private int creator_trx_id;// 构造函数,用于创建ReadView对象public ReadView(Transaction tx, Set<Integer> txs) {// 将传入的事务对象赋值给creator_trx_idthis.creator_trx_id = tx.getId();this.txs = txs;// 使用stream流获取传入的事务集合中的最小事务idmin_trx_id = txs.stream().min(Integer::compareTo).get();// 使用stream流获取传入的事务集合中的最大事务id,并加1max_trx_id = txs.stream().max(Integer::compareTo).get() + 1;}public Set<Integer> getTxs() {return txs;}public int getMin_trx_id() {return min_trx_id;}public int getMax_trx_id() {return max_trx_id;}public int getCreator_trx_id() {return creator_trx_id;}
}

DataStore:数据存储,维护数据版本链、活跃事务

import java.util.*;
import java.util.concurrent.TimeUnit;public class DataStore {// 数据版本链private final List<Data> dataList = new LinkedList<>();// 当前活跃事务,用于生成readview readview决定事务读到哪个版本的数据private final Set<Integer> activeTrxIds = new TreeSet<>();// 读视图缓存:隔离性为可重复读时返回第一次创建的读视图private final Map<Transaction, ReadView> map = new HashMap<>();private final StringBuffer sb = new StringBuffer();public ReadView getReadView(Transaction tx) {if (tx.getIsolationLevel() == Transaction.IsolationLevel.REPEATABLE_READ) {if (map.containsKey(tx)) {return map.get(tx);}ReadView readView = new ReadView(tx, activeTrxIds);map.put(tx, readView);return readView;} else if (tx.getIsolationLevel() == Transaction.IsolationLevel.READ_COMMITTED) {return new ReadView(tx, activeTrxIds);}return null;}public Data readData(Transaction tx) {tx.beginTransaction();
//        activeTrxIds.add(tx.getId());System.out.println("当前事务ID:" + tx.getId());System.out.println("活跃事务:" + activeTrxIds);ReadView rv = getReadView(tx);int creatorTrxId = rv.getCreator_trx_id();int minTrxId = rv.getMin_trx_id();int maxTrxId = rv.getMax_trx_id();Set<Integer> txs = rv.getTxs(); // 活跃事务集合System.out.println("视图: 创建者ID:" + creatorTrxId + " 最小事务ID:" + minTrxId + " 最大事务ID:" + maxTrxId + " 活跃事务:" + txs);Data first = dataList.getFirst(); // 当前记录int dbTrxId = first.getDB_TRX_ID();// 沿着版本链找数据 与读视图比较Data head = dataList.getFirst();while (head != null) {System.out.println("当前记录事务ID:" + dbTrxId);// 是否创建者if (dbTrxId == creatorTrxId) {System.out.println("创建者... 可见");return head;}// 是否比最小事务还小if (dbTrxId < minTrxId) {System.out.println("比最小事务还小... 可见");return head;}// 是否在中间if (dbTrxId >= minTrxId && dbTrxId <= maxTrxId && !txs.contains(dbTrxId)) {System.out.println("在活跃事务最小值和最大值中间并且不是活跃事务... 可见");return head;}head = head.getNext();if (head != null) {dbTrxId = head.getDB_TRX_ID();}System.out.println("轮询...");}tx.commit();return first;}/*** 每次事务更新数据时生成一个版本*/public Data update(Transaction tx, Data data, String val) {tx.beginTransaction();Data data1 = null;synchronized (dataList) {activeTrxIds.add(tx.getId());if (dataList.isEmpty()) {dataList.addFirst(data);sb.append(data.getDB_TRX_ID()).append("<-");} else {data1 = new Data(val, tx.getId(), dataList.getFirst());dataList.addFirst(data1);sb.append(data1.getDB_TRX_ID()).append("<-");}}try {TimeUnit.SECONDS.sleep(new Random().nextInt(5));} catch (InterruptedException e) {throw new RuntimeException(e);}tx.commit();System.out.println("事务:" + tx.getId() + "提交了...");activeTrxIds.remove(tx.getId());return data1;}public Data getFirstData() {return dataList.getFirst();}public String getTransactionChain() {String substring = sb.substring(0, sb.length() - 2);return substring;}}

Client:测试类 设置事务不同隔离级别会读到不同版本数据

import java.security.SecureRandom;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;public class Client {private static AtomicInteger counter = new AtomicInteger(1);public static void main(String[] args) {// 事务修改数据,记录进logDataStore log = new DataStore();for (int i = 1; i <= 10; i++) {Thread.ofPlatform().start(() -> {Transaction tx = new Transaction(counter.getAndIncrement());Data data = new Data("100", tx.getId(), null);String s = new SecureRandom().nextInt(100) + "";log.update(tx, data, s);});}// 延迟1秒读数据,等版本链生成try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}// 当前记录Data curr = log.getFirstData();System.out.println("当前记录:" + curr);System.out.println("事务处理链:" + log.getTransactionChain());// 读数据Transaction tx = new Transaction(new Random().nextInt(4) + 1);
//        tx.setIsolationLevel(Transaction.IsolationLevel.READ_COMMITTED);Data readData = log.readData(tx);System.out.println("选择快照:" + readData);System.out.println("+++++++++++++++++++++++++++++++++++");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}Transaction tx2 = new Transaction(new Random().nextInt(9) + 1);
//        tx2.setIsolationLevel(Transaction.IsolationLevel.READ_COMMITTED);readData = log.readData(tx2);System.out.println("选择快照:" + readData);}
}

一种测试结果

事务:8提交了...
事务:7提交了...
事务:5提交了...
当前记录:Data{value='30', DB_TRX_ID=5, next=Data{value='88', DB_TRX_ID=3, next=Data{value='47', DB_TRX_ID=1, next=Data{value='62', DB_TRX_ID=10, next=Data{value='55', DB_TRX_ID=6, next=Data{value='14', DB_TRX_ID=8, next=Data{value='65', DB_TRX_ID=4, next=Data{value='56', DB_TRX_ID=9, next=Data{value='53', DB_TRX_ID=2, next=Data{value='100', DB_TRX_ID=7, next=null}}}}}}}}}}
事务处理链:7<-2<-9<-4<-8<-6<-10<-1<-3<-5
当前事务ID:1
活跃事务:[1, 2, 3, 4, 6, 9, 10]
视图: 创建者ID:1 最小事务ID:1 最大事务ID:11 活跃事务:[1, 2, 3, 4, 6, 9, 10]
当前记录事务ID:5
在活跃事务最小值和最大值中间并且不是活跃事务... 可见
选择快照:Data{value='30', DB_TRX_ID=5, next=Data{value='88', DB_TRX_ID=3, next=Data{value='47', DB_TRX_ID=1, next=Data{value='62', DB_TRX_ID=10, next=Data{value='55', DB_TRX_ID=6, next=Data{value='14', DB_TRX_ID=8, next=Data{value='65', DB_TRX_ID=4, next=Data{value='56', DB_TRX_ID=9, next=Data{value='53', DB_TRX_ID=2, next=Data{value='100', DB_TRX_ID=7, next=null}}}}}}}}}}
+++++++++++++++++++++++++++++++++++
事务:4提交了...
事务:1提交了...
当前事务ID:2
活跃事务:[2, 3, 6, 9, 10]
视图: 创建者ID:2 最小事务ID:2 最大事务ID:11 活跃事务:[2, 3, 6, 9, 10]
当前记录事务ID:5
在活跃事务最小值和最大值中间并且不是活跃事务... 可见
选择快照:Data{value='30', DB_TRX_ID=5, next=Data{value='88', DB_TRX_ID=3, next=Data{value='47', DB_TRX_ID=1, next=Data{value='62', DB_TRX_ID=10, next=Data{value='55', DB_TRX_ID=6, next=Data{value='14', DB_TRX_ID=8, next=Data{value='65', DB_TRX_ID=4, next=Data{value='56', DB_TRX_ID=9, next=Data{value='53', DB_TRX_ID=2, next=Data{value='100', DB_TRX_ID=7, next=null}}}}}}}}}}
事务:2提交了...
事务:9提交了...
事务:3提交了...
事务:10提交了...
事务:6提交了...

MVCC基本概念

基本概念
当前读 读取的是记录的最新版本
快照读 读取的是记录的历史版本Read Committed:每次select,都生成一个快照读Repeatable Read:开启事务后第一个select生成一个快照读,后续select都是基于这个快照读Serializable:快照读退化为当前读
MVCC:三个隐式字段、undo log、readview
1:三个隐式字段DB_TRX_ID: 最近修改事务的idDB_ROLL_PTR: 回滚指针,指向上一个版本数据DB_ROW_ID: 行id,唯一标识一条记录
2:undo log版本链不同事务或相同事务对同一条记录进行修改,会导致该记录的undo log生成一条记录版本链表,链表头部是最新的旧记录,尾部是最早旧的记录
3:readview 快照读SQL执行时,MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)idreadview包含四个核心字段:m_ids:当前活跃的事务id集合min_trx_id:当前活跃事务中最小的事务idmax_trx_id:系统将要分配给下一个事务的idcreator_trx_id:生成当前readview的事务id版本可见性判断1:如果被访问数据的DB_TRX_ID与readview的creator_trx_id相同,说明当前事务在访问自己修改过的记录,版本可见2:如果被访问数据的DB_TRX_ID小于readview的min_trx_id,说明当前事务在访问已经提交的事务修改过的记录,版本可见3:如果被访问数据的DB_TRX_ID大于readview的max_trx_id,说明当前事务在访问将来要执行的事务修改过的记录,版本不可见4:如果被访问数据的DB_TRX_ID在readview的min_trx_id和max_trx_id之间,说明当前事务在访问其他事务修改过的记录,版本不可见,需要通过DB_ROLL_PTR找到上一个版本数据,然后判断版本可见性如果DB_TRX_ID不在m_ids中是可以访问该版本的

相关文章:

用Java写一个MVCC例子

MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是一种用于数据库管理系统中处理并发访问数据的技术。它允许事务在查询时看到数据的一个快照版本&#xff0c;而不是直接查看最新的提交数据。这种方法不仅提高了并发性能&#xff0c…...

【遥感科普】卫星影像产品处理等级有哪些?

遥感数据等级划分是指将卫星遥感原始数据按处理深度分为不同等级&#xff0c;用户可快速匹配需求&#xff1a;初级数据适合算法开发&#xff0c;高级产品可直接用于分析。分级体系促进数据标准化&#xff0c;降低使用门槛&#xff0c;提升跨机构协作效率&#xff1b;同时便于质…...

第十二天 - Flask/Django基础 - REST API开发 - 练习:运维管理后台API

从零开始用Flask/Django构建运维管理后台API&#xff08;实战指南&#xff09; 前言&#xff1a;为什么选择Python Web框架&#xff1f; 在运维自动化领域&#xff0c;构建管理后台是每个运维工程师的必修课。本文将通过Flask和Django两个主流框架&#xff0c;手把手教你构建…...

计算机视觉与深度学习 | 视觉里程计(Visual Odometry, VO)学习思路总结

视觉里程计(Visual Odometry, VO)学习思路总结 视觉里程计(VO)是通过摄像头捕获的图像序列估计相机运动轨迹的技术,广泛应用于机器人、自动驾驶和增强现实等领域。以下是一个系统的学习路径,涵盖基础理论、核心算法、工具及实践建议:一、基础理论与数学准备 核心数学工具…...

解决vite.config.ts 引入scss 预处理报错

版本号&#xff1a; "sass": "^1.86.3","sass-loader": "^16.0.5","vite": "^6.2.0" 报错图片&#xff1a; vite.config.ts 一开始文件错误 修改之后&#xff1a;完美解决报错&#xff08;不过我还没搞懂为什么…...

Design Compiler:中断命令/脚本的执行

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 中断命令的执行 如果在使用命令时输入了错误的选项或输入了错误的命令&#xff0c;可以使用CtrlC手动中断命令的执行并返回到dc_shell中&#xff0c;此时终端…...

图灵逆向——题十七-字体加密

十七题是一个很经典的字体加密案例&#xff0c;很适合新手入门~ 目录列表 过程分析代码实现 过程分析 打开开发者工具直接看请求&#xff0c;发现它请求的没有加密参数&#xff0c;以为万事大吉的你迫不及待的点击了响应&#xff0c;然后就会发现依托。。。 返回的数据中字体…...

uniapp微信小程序图片生成水印

整体思路&#xff1a; 用户通过uni.chooseImage选择图片后&#xff0c;获得图片文件的path和size。通过path调用uni.getImageInfo获取图片信息&#xff0c;也就是图片宽高。图片宽高等比缩放至指定大小&#xff0c;不然手机处理起来非常久&#xff0c;因为手机随便拍拍就很大。…...

【MySQL】001.MySQL安装

文章目录 一. MySQL在Ubuntu 20.04 环境安装1.1 更新软件包列表1.2 安装MySQL服务器1.3 配置安全设置1.4 检查mysql server是否正在运行1.5 进行连接1.6 查询自带的数据库 二. 配置文件的修改三. MySQL连接TCP/IP时的登陆问题四. MySQL中的命令 一. MySQL在Ubuntu 20.04 环境安…...

《深度剖析 Linux 权限管理:从基础到进阶,解锁系统安全密钥》

一、权限管理 1.1 普通权限&#xff08;普通文件和目录&#xff09; [rootmd ~]# ll total 124 drwxr-xr-x. 2 root root 28 Feb 16 15:48 : drwxr-xr-x. 3 root root 64 Mar 9 00:22 111 -rw-r--r--. 1 root root 43 Feb 17 22:44 1.txt 1 2 …...

2025年4月9日-华为暑期实习-第一题-100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 软件依赖链分析系统 问题描述 LYA 是某软件公司的工程师,负责管理公司的软件依赖关系。每个软件组件都有可能依赖于其他组件,形成一个依赖链。为了确保系统的稳定性,LYA 需要…...

leetcode 377. Combination Sum IV

这道题也是完全背包问题。这道题和第518题几乎一摸一样&#xff0c;所不同的是&#xff0c;第518题要求的是组合数&#xff0c;而第377题要求的是排列数。虽然本题题目描述中说求的是组合数&#xff0c;但从例子1中&#xff08;1&#xff0c;1&#xff0c;2&#xff09;和&…...

【TS学习】(22)什么是混入

在 TypeScript 中&#xff0c;混入&#xff08;Mixins&#xff09; 是一种设计模式&#xff0c;用于将多个类的功能组合到一个类中。它是一种实现代码复用的方式&#xff0c;尤其适用于需要从多个来源继承功能的场景。TypeScript 不直接支持多继承&#xff0c;但可以通过混入模…...

Firebase Studio,谷歌推出的云端AI 开发环境

Firebase Studio 是谷歌推出的一款基于云的全栈应用开发环境&#xff0c;旨在帮助开发者高效构建和交付集成 AI 功能的高质量应用。该平台结合了 Project IDX 和专用的 Firebase AI 代理&#xff0c;提供从后端到前端、移动应用等多维度的开发支持。 Firebase Studio是什么 F…...

电能质量在线监测分析装置支持实时监测、数据存储及远程传输,适用于电网、工业等场景

电能质量在线监测分析装置主要技术指标 2.1工作电源 交流&#xff1a;220V10% &#xff1b;50Hz0.5Hz&#xff1b;谐波畸变率不大于15&#xff05; 直流&#xff1a;220V10%&#xff0c;纹波系数不大于5% 2.2电流信号输入 输入方式&#xff1a;电流互感器输入&#xff1b; …...

线代[13]|线性代数题37道以及数学分析题3道(多图预警)

博主首次发布于CSDN&#xff0c;禁止转载&#xff01;&#xff08;CSDN&#xff1a;汉密士2025&#xff09; 文章目录 一、缘起&#xff5c;《俗说矩阵》课程目录照片存档&#xff5c;线性代数学习脉络&#xff5c;线代习题集封面存档&#xff5c;未来——我与线性代数的纠缠 二…...

gitlab内置pgsql数据库迁移

gitlab内置pgsql数据库迁移 创建gitlab备份方法一&#xff0c;使用pg_dump备份方法二 使用gitlab工具 gitlab-backup 备份 运行sql文件注意事项ERROR: extension "btree_gist" has no installation script nor update path for version "1.7"btree_gist 找…...

IDEA、Webstorm使用账号密码登录Gitlab

在开发过程中&#xff0c;为了保证代码安全&#xff0c;更改了gitlab司库的密码&#xff0c;当更新项目时&#xff0c;发现更新失败了。让填入access_token&#xff0c;gitlab网页设置中虽然generate了token&#xff0c;也填入了它&#xff0c;但是还是报错401unauthorized&…...

水利水电安全员ABC适合哪些人考?

水利水电安全员证是水利工程建设领域的重要职业资格证书&#xff0c;主要涉及水利水电工程施工安全管理、风险防控和应急处理等工作。那么&#xff0c;哪些人适合考取&#xff1f; 哪些人适合考水利水电安全员&#xff1f; 1. 水利水电工程从业人员 ✅ 施工管理人员&#xf…...

Service Mesh 深度解析与 Istio+Envoy 实现方案

Service Mesh 深度解析与 IstioEnvoy 实现方案 一、Service Mesh 技术全景 核心架构演进 第一代架构&#xff1a;以库形式集成&#xff08;如 Netflix OSS&#xff09;第二代架构&#xff1a;Sidecar 代理模式&#xff08;如 Linkerd&#xff09;第三代架构&#xff1a;全功…...

使用uv管理python项目环境

安装uv 使用默认python环境安装uv&#xff08;把uv安装到默认python环境&#xff09;&#xff1a;pip install uv 创建python项目虚拟环境 如果是已有项目并且项目中有uv.lock文件&#xff0c;直接运行 uv run main.py&#xff0c;这会默认使用uv.lock文件创建虚拟环境如果是新…...

【Code】《代码整洁之道》笔记-Chapter9-单元测试

第9章 单元测试 过去十年以来&#xff0c;编程专业领域进步很大。1997年时&#xff0c;没人听说过测试驱动开发。对于我们之中的大多数人来说&#xff0c;单元测试是那种用来确保程序“可运行”的用过即扔的短代码。我们辛勤地编写类和方法&#xff0c;再弄出一些特殊代码来测…...

数据结构-顺序表

目录 基本概念 什么是数据结构&#xff1f; 数据 结构 线性结构 树形结构 网状结构 第一章绪论 了解概念 几个概念 数据存储方式&#xff1a; 算法的五个重要特性: 算法设计的要求: 总结 线性表 线性表的定义&#xff1a; 顺序表的设计思想 定长顺序表 不定…...

端到端语音识别服务重构方案

以下是重构ASR服务架构&#xff0c;集成Whisper V3Conformer混合模型的端到端实现方案&#xff0c;经过技术增强与流程优化&#xff1a; 端到端语音识别服务重构方案 基于Whisper V3Conformer混合架构 系统架构设计 采用四层微服务架构&#xff0c;支持水平扩展与模块化部署…...

耳根圆通与禅定的交融与分野

引言 在浩瀚的修行体系中&#xff0c;耳根圆通与禅定的关系犹如月映千江——本质同一而显相各异。本文以《楞严经》为经教依据&#xff0c;结合禅宗心法与现代实证视角&#xff0c;系统解析二者在修行原理、实践路径与终极旨归中的深刻关联与微妙差异&#xff0c;揭示这一古老智…...

python基础语法:缩进规则

Python 的缩进规则是其语法的重要组成部分&#xff0c;它通过缩进来表示代码块的层次结构&#xff0c;而不是像其他语言&#xff08;如 C 或 Java&#xff09;那样使用大括号 {}。以下是 Python 缩进规则的详细说明&#xff1a; 1. 缩进的基本规则 代码块的标识&#xff1a;Pyt…...

从0到1的Python接口自动化学习路线

Python 是一门非常适合初学者且功能强大的编程语言,它在接口自动化测试领域具有广泛应用。 以下是一份针对 Python 与接口自动化测试的详细学习路线,帮助你从零开始学习并逐步掌握相关知识。 第一阶段:Python基础 目标:掌握 Python 基本语法和编程能力。 一、学习内容 1.…...

大数据(7.3)Kafka量子安全加密实践指南:构建抗量子计算攻击的消息系统

目录 一、量子计算带来的加密革命1.1 量子计算机的威胁时间表1.2 Kafka现有加密机制脆弱性分析 二、后量子加密算法选型2.1 NIST标准化算法矩阵2.2 混合加密最佳实践 三、Kafka量子安全改造方案3.1 Bouncy Castle量子安全Provider3.2 Kafka服务端配置 四、实战案例&#xff1a;…...

【11408学习记录】英语语法精讲:主从复合句之状语从句全解析——以时间状语从句为例

时间 英语语法总结—— 主从复合句状语从句从句位置从句的分类 每日一句词汇第一步&#xff1a;找谓语第二步&#xff1a;断开第三步&#xff1a;简化第一句第二句第三句第四句 英语 语法总结—— 主从复合句 状语从句 状语从句指的是一个句子作状语&#xff0c;表达“描述性…...

深度分页及优化建议

深度分页的定义 深度分页是指在分页查询中&#xff0c;当用户请求非常靠后的页面时&#xff0c;数据库需要处理大量数据&#xff0c;导致查询性能显著下降的情况。例如&#xff0c;一个查询结果有 100 万条记录&#xff0c;而用户要查询第 999 页&#xff08;每页 10 条记录&a…...

阿里云kafka集成boot在docker启动找不到kafka.client.truststore.jks文件问题

此问题困扰了我好久&#xff0c;看阿里云官方文档&#xff0c;建议配置绝对路径&#xff0c;但项目部署在docker没有绝对路径&#xff0c;开始以为配置在docker的/root下即可&#xff0c;但报找不到文件&#xff0c;后来改相对路径 ./kafka.client.truststore.jks,…/…/还是找…...

kafka 集群搭建,开启sasl认证

Kafka提供了多种认证方式来保护集群的安全性,包括以下几种常见的认证方式: SSL/TLS认证:Kafka支持使用SSL/TLS协议对网络通信进行加密和认证。通过使用SSL/TLS证书对客户端和服务器进行身份验证,可以确保通信的机密性和完整性。SASL/PLAIN认证:SASL/PLAIN是一种基于用户名…...

在 iOS 项目中,Info.plist文件用于配置应用的基本信息和权限

在 iOS 项目中,Info.plist 文件用于配置应用的基本信息和权限。以下是常见的需要添加的权限及其说明: 常见权限及说明 NSCameraUsageDescription 说明: 说明应用为何需要访问相机。示例: “我们需要访问您的相机以便您可以拍摄照片。”NSPhotoLibraryUsageDescription 说明:…...

【完整可用】使用openhtmltopdf生成PDF(带SVG)

文章目录 前言OpenHTMLToPDF 简介maven配置依赖字体文件demo代码其他资源放置截图防止maven编译字体文件 前言 AI和网上都是跑不起来或者版本过低的&#xff0c;还有各种BUG的。本文都是查阅官方文档得出的。如果你能跑起来请给个大大的赞&#xff01; OpenHTMLToPDF 简介 Ope…...

仿照管理系统布局配置

1.vue仿照snowy 配置&#xff0c;如下图&#xff1a; 2.代码实现 <template><div class"theme-settings"><!-- 导航栏 --><div class"nav-bar"><el-breadcrumb separator"/"><el-breadcrumb-item>导航设置…...

RLAgent note

OpenManus github LlamaGym github GRPO 实践 知乎&#xff1a;Deepseek R1 Zero成功复现 BabyAGI 0&#xff0c;环境 CUDA版本12.X&#xff1a;nvcc -V python 3.10&#xff1a;python -V gcc 11&#xff1a;gcc -V 1&#xff0c;安装llama-cpp-python [git | docs]…...

Python设计模式-工厂模式

一、模式定义与核心思想 工厂模式&#xff08;Factory Pattern&#xff09;属于创建型设计模式&#xff0c;其核心思想是通过一个"工厂类"来创建对象&#xff0c;而不是直接调用类的构造函数。这种模式将对象的实例化过程封装起来&#xff0c;使系统在实例化对象时能…...

Vue环境搭建:vue+idea

目录 第一章、Vue环境搭建&#xff1a;安装node2.1&#xff09;node的下载2.2&#xff09;配置node的环境变量2.3&#xff09;常见的npm命令 第二章、使用idea创建vue工程2.1&#xff09;在IDEA中设置国内镜像2.2&#xff09;在IDEA中进行脚手架安装2.3&#xff09;在IDEA中创建…...

庙算兵推:使用Streamlit框架构建了一个智能作战推演系统。

这段代码是一个完整的军事模拟应用&#xff0c;使用Streamlit框架构建了一个智能作战推演系统。该系统包括了三维地图显示、作战单位管理、应急事件处理等功能。用户可以通过界面控制推演的开始和暂停&#xff0c;调整时间加速倍率&#xff0c;并查看实时的战斗情况和系统状态。…...

APIGen-MT:高效生成多轮人机交互Agent数据的两阶段框架

APIGen-MT&#xff1a;高效生成多轮人机交互数据的两阶段框架 引言 随着人工智能技术的飞速发展&#xff0c;AI代理&#xff08;Agent&#xff09;已从简单的聊天机器人发展为能够执行复杂现实任务的系统&#xff0c;例如管理金融交易、安排预约和处理客户服务等。然而&#x…...

02-redis-数据结构实现原理

1、redis整体涉及的结构 在redis中整体是KV键值对的方式进行访问的&#xff0c;redis的查询的时间复杂度O(1)&#xff0c;底层的数据结构其实跟java中的HashMap底层实现类似&#xff0c;整体采用的是数组链表的实现方式&#xff0c;哈希冲突的时候使用的是链表法解决&#xff1…...

京华幻梦:科技自然共生诗篇

故事摘要 故事发生在现代中国北京&#xff0c;展现了未来城市的奇幻景象与科技变革。在这个充满想象的未来世界里&#xff0c;科技与自然不再对立&#xff0c;而是达成了和谐共生的美妙平衡。故宫、鸟巢、798艺术区等标志性地点&#xff0c;在科技的赋能下焕发新的生机&#x…...

python:面向对象之包

1.包的定义&#xff1a; 包就是把有联系的模块组织在一起&#xff0c;即放在同一文件夹下&#xff0c;并且在这个文件夹下创建一个__init__.py文件&#xff0c;这个文件就叫做包。 2.包的创建&#xff1a; 创建好好会自动生成一个__init__.py文件。 3.包的调用&#xff1a; …...

spring boot整合redis

spring boot整合redis 步骤&#xff1a; ① 引入redis依赖 <dependency><groupId>org.springframework.boot</group><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>②在application.yml配置文件中&#xff0c…...

DIA——边缘检测

1.边缘 边缘是像素的突变位置。 2.常见边缘检测算法 通过找到一阶导数的极值点或者二阶导数的过零点来确定边缘像素的位置。边缘检测通常使用算子&#xff0c;即特定的卷积核。通过差分对离散的像素点求导&#xff0c;然后转化成卷积核进行卷积。使用卷积统一涵盖求导&…...

redis 免安装版本 启动方法 windows 安装包

redis 免安装版本 启动方法 windows 安装包 下载解压直接使用 百度网盘连接如下 链接&#xff1a;https://pan.baidu.com/s/1W4ICvdUUxkWPhK93GtdG0Q 提取码&#xff1a;vzw3 下载解压后会用32位和64位两种&#xff0c;根据自己的电脑选择 cmd命令 cd /d D:\yaochengwei\so…...

C语言练习二 进制转换

#include <stdio.h>// 强制类型转换int main(){int i 5;float j i / 2; // 只是把整形先除了 再赋值float k (float)i / 2; //先强制改成float 再赋值printf("%f\n",j);printf("%f\n",k);return 0; } #include <stdio.h> int main(){int…...

AlDente Pro for Mac电脑 充电限制保护工具

AlDente Pro for Mac电脑 充电限制保护工具 一、介绍 AlDente Pro for Mac&#xff0c;是一款充电限制保护工具&#xff0c;是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池&#xff08;如 MacBook 中的电池&#xff09;在40&#xff05; 至 80&#xff05; 之…...

物联网卡(NB-IoT/4G)技术详解

物联网卡&#xff08;IoT SIM卡&#xff09;是专为物联网设备设计的流量卡&#xff0c;支持NB-IoT、4G Cat.1等低功耗广域网络&#xff08;LPWAN&#xff09;&#xff0c;广泛应用于智能烟感、共享设备、车联网等领域。以下是NB-IoT和4G物联网卡的对比与选型指南。 1. NB-IoT v…...

HTML5 Video (视频) 深入解析

一、引言 在当今的互联网时代,视频已经成为网站内容中不可或缺的一部分。从产品介绍、教程演示到娱乐内容,视频以其生动直观的特点吸引着大量用户。HTML5 的出现,为在网页上展示视频提供了一个标准且强大的解决方案,改变了过去依赖插件(如 Flash)来显示视频的局面。 二…...