Seata分布式事务框架及XA模式
笔者参与了OSPP-2025开源之夏 Seata社区的议题:Seata-Go与Seata-Java版本拉齐,在实现XA模式支持PostgreSQL数据库的时候,通过写测试,发现自己对Seata、对XA模式的理解,还不够深刻,故查阅源码、官网文章,针对自己不懂的、理解有误的,整理出一篇笔记。 相关连接: Seata官网 Seata官方仓库 1. 怎么理解Seata分布式事务框架1.1 三个角色想象一个特殊的场景: 一个小公司承包了一个建筑项目,这个小公司的组成是,一堆工人(RM),一个管理所有工人包工头(TM),一个记下来哪个工人干啥的会计(TC)。 这个包工头(TM)非常奇葩,他的要求是,要么所有工人(RM)做的事都做成功了,才能下班;一旦有一个工人(RM)做的工作失败了,则所有人的工作全部毁掉,回到原始状态。 工地开工前,包工头(TM)拿着图纸找到会计(TC):“今天要完成地基+砌墙+铺水电,给这个活儿编个号(XID),记着——要么全成,要么全拆。” 会计点点头,在账本上记下:“项目XID=001,状态:开始”。 ...
黑马点评笔记(1)短信登录
笔者中间件学的像构式,so趁暑假过一遍黑马点评查漏补缺一下 个人笔记向 基于Session的登录Session是啥在 Web 开发中,Session(会话) 是一种用于在服务器端存储用户状态信息的机制。它主要解决了 HTTP 协议的无状态性问题——即服务器无法天然记住不同请求是否来自同一个用户。 关于 Session 的几个核心点: 本质:Session 是服务器为每个用户(浏览器)创建的一块内存存储空间(也可能是文件、数据库等持久化存储),用于保存该用户的临时数据。 工作原理: 当用户第一次访问服务器时,服务器会创建一个 Session,并生成一个唯一的 Session ID(通常通过 Cookie 发送给浏览器)。 后续该用户的所有请求都会携带这个 Session ID,服务器通过 ID 找到对应的 Session 空间,从而识别用户并获取之前存储的数据。 为什么 setAttribute 和 getAttribute 能直接用? session.setAttribute("code", code):将数据以键值对(”code”...
区块链初探
记录笔者学习区块链 1.什么是区块链1.1区块区块是区块链中存储交易数据的 “数据单元”,就像一本账本中的 “一页”。每个区块包含两部分: 本区块内的交易记录(比如谁转给谁多少代币) 前一个区块的哈希值(相当于 “页码”),通过这个值将所有区块串联成链,形成 “区块链” 1.2定义区块链是一种去中心化的分布式账本技术,核心是通过密码学和共识机制,将数据以 “区块” 为单位按时间顺序串联成链,存储在网络中的多个节点上,实现数据的公开透明、不可篡改和集体维护 1.3核心特点 去中心化:数据不存储在单一中心服务器,而是分布在网络中大量独立节点(如个人电脑、服务器)上,没有任何单一机构或个人能控制整个网络 不可篡改:每个区块包含前一区块的加密哈希值(类似 “数字指纹”),若修改某一区块数据,后续所有区块的哈希值都会失效,且需全网多数节点认可才能生效,几乎不可能造假 透明可查:链上数据对所有节点公开(部分私有链可限制访问),任何人都能查看交易记录或数据历史,确保过程公开。共识机制:网络中的节点通过预设规则(如工作量证明 PoW、权益证明...
redis基础
学习redis的笔记,本文旨在基础概念的梳理、命令熟悉和使用 SQL和NoSQLredis是典型的非关系型数据库(NoSQL) 非关系型数据库特征: 无需提前定义表结构 根据场景设计合适的数据结构 弱化事务一致性,如不支持复杂的join 命令通用命令 KEYS:查看符合模板的所有key,不建议在生产环境设备上使用 DEL:删除一个指定的key EXISTS:判断key是否存在 EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除 TTL:查看一个KEY的剩余有效期 string命令 SET:添加或者修改已经存在的一个String类型的键值对 GET:根据key获取String类型的value MSET:批量添加多个String类型的键值对 MGET:根据多个key获取多个String类型的value INCR:让一个整型的key自增1 INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2...
Java-HashMap浅析
本文旨在拆解 Java HashMap 解决哈希冲突的机制,深入到每个步骤和设计考量。核心围绕 桶数组 (Buckets)、链表 (Chaining)、红黑树 (Treeify) 和 扩容 (Resizing) 展开 核心机制深度剖析: 底层结构:桶数组 (Node<K,V>[] table) 本质: 一个固定长度的数组(初始化后长度可动态扩容),数组的每个元素称为一个 桶 (Bucket) 初始容量: 默认为 16 (DEFAULT_INITIAL_CAPACITY),可指定。容量总是 2 的幂次方(如 16, 32, 64…)。这是为了高效使用位运算 (n - 1) & hash 代替取模 hash % n 桶的状态: null:该桶当前没有存储任何键值对 Node 对象:该桶存储了一个键值对节点。这个 Node 可能是: 一个 单节点:该桶目前只有一个键值对(理想情况) 一个 单向链表 (Singly Linked List) 的头节点:该桶有多个键值对,通过链表连接 一个 红黑树 (Red-Black Tree) 的根节点...
一致性哈希浅析
本文不做深层次探究,仅为记录笔者在用一致性哈希实现动态路由层的一些想法 前情提要当用户登录时,我们需要为用户分配netty服务实例,所以我们从nacos上拉下来了服务实例列表 实际只有一个…项目体量很小,现在需要把用户分配到实例上 技术选型我们选用一致性哈希。首先来看为什么摒弃普通哈希 普通哈希的缺点普通哈希的计算核心是$hashCode(id)$ % $实例数n$,这就意味着,当节点增删的时候,几乎所有连接都需要被重置,性能开销太大,连接也不稳定 一致性哈希实现(部分) 具体代码在文末 数据结构设计 变量名 类型 作用 Nodes TreeMap<Integer, String> 存储 “虚拟节点哈希值→物理节点 URL” 的映射。TreeMap 的有序性(红黑树实现)是实现 “顺时针查找下一个节点” 的关键。 VIRTUAL_NODES int 每个物理节点对应的虚拟节点数量(默认 160),用于解决物理节点分布不均导致的负载倾斜。 instances List<ServiceInstance> 存储真实的服务实例(如...
netty框架笔记
Netty网络编程框架学习笔记。涉及核心组件与架构设计、主从reactor模式。仅覆盖自己设计nettyserver时查询的知识。 netty架构netty采用分层设计,从上层API到底层实现逐步抽象,核心组件分为四层 123456789101112131415161718192021222324252627282930313233343536373839404142434445┌─────────────────────────────────────────────────────┐│ 引导层 (Bootstrap) ││ ┌───────────────────────┐ ┌─────────────────────┐ ││ │ ServerBootstrap │ │ Bootstrap │ ││ │ (服务端启动引导类) │ │ (客户端启动引导类) │ ││ └───────────────────────┘ ...
MySQL笔记(5)行锁表锁全局锁
自存笔记,学习MySQL实战45讲 第五讲:全局锁和表级锁全局锁 一种将整个数据库实例锁定的机制 会组织其他事务对数据库的读写访问 一般在逻辑备份中使用 实现 在InnoDB中可以使用 mysqldump 的 —single-transaction 选项,结合 InnoDB 的 MVCC 机制实现一致性备份,无需全局锁 1mysqldump -u root -p --all-databases --single-transaction > backup.sql 在不支持事务的引擎中 123FLUSH TABLES WITH READ LOCK;-- 执行备份或其他需要全局一致性的操作UNLOCK TABLES; 123SET GLOBAL READ_ONLY=1;-- 执行操作SET GLOBAL READ_ONLY=0; **建议使用FTWRL** 表级锁读锁可兼容读锁,写锁阻塞所有锁 表锁 锁定粒度为整张表 在存储引擎层加锁 不仅会对表的写/读加锁,获取到锁的线程也只能对限定的表做限定的写/读操作 1LOCK TABLES...
SQL笔记
学习SQL写法 && 数据库一些用法 的笔记 JOIN 数据分散到多个表时,需要用表连接来关联数据 每个join操作都会生成一个中间表,根据需要去进一步操作 结构 123SELECT 表1.字段, 表2.字段FROM 表1[连接类型] JOIN 表2 ON 表1.共同字段 = 表2.共同字段; 内连接只返回两表之中满足条件的记录(交集) 123SELECT *FROM 表AINNER JOIN 表B ON 表A.id = 表B.user_id; -- 可简写为 JOIN 左连接返回左表(表 A)的 所有记录,右表(表 B)中匹配的记录,若右表无匹配则用 NULL 填充 123SELECT *FROM 表ALEFT JOIN 表B ON 表A.id = 表B.user_id; 右链接返回右表(表 B)的 所有记录,左表(表 A)中匹配的记录,若左表无匹配则用 NULL 填充 123SELECT *FROM 表ARIGHT JOIN 表B ON 表A.id = 表B.user_id; 全外链接返回两表的 所有记录,匹配的记录合并,不匹配的字段用 NULL...
MySQL笔记(4):索引
自存笔记,学习MySQL实战45讲 第四讲:索引常用数据结构、B+树、索引维护索引常用数据结构哈希表 以键值对形式存储数据 等值查询复杂度是O(1),范围查询性能很差,因为存储位置之间无序 底层实现通常是,数组+链表/红黑树,当多个键映射到同一索引,这些键值会以链表/红黑树形式存储在该索引位置 有序数组 就是数组中元素按照某种固定顺序排序的数组 等值查询和范围查询性能都很优秀,有序可以用二分 但是更新数据很麻烦,比如中间插入一个记录就要改动后面的所有记录,只适合静态存储引擎 N叉树 分叉多,树高很低,访问磁盘次数很低 B+树 InnoDB使用了B+树索引模型 每一个索引再InnoDB里面对应一颗B+树 非叶子节点只存索引键和指向子节点的指针,叶子节点存索引键和完整记录(主键索引)/主键值(非主键索引) 聚簇索引VS二级索引 特性 主键索引(聚簇索引) 非主键索引(二级索引) 非叶子节点内容 主键值 + 子节点指针 非主键字段值 + 子节点指针 叶子节点内容 主键值 + 完整记录 非主键字段值 +...
