Sirius
Sirius
Home avatar

Fan的博客

golang 1.24 引入的 Swiss map 算法原理理解

本文主要讲解 Go 1.24 中引入的 Swiss Map . 我们首先需要回顾一下之前的 map 是如何工作的。 然后讲解 Swiss Map 原理

在 1.24 版本之前,Go 的 map 实现是一种经典的链式哈希表。其核心思想如下:

golang context 原理

  1. 取消传播 (Cancellation Propagation):

    • 这是 context 最核心和最常用的功能。当一个操作因为某种原因(例如,用户取消了请求、上游服务超时或出错、父操作不再需要结果)需要被终止时,可以使用 context 来通知所有相关的、为此操作派生出来的 Goroutine 停止它们的工作。
    • 这有助于避免不必要的资源消耗(如 CPU、内存、网络连接),并及时释放资源。例如,一个 HTTP 请求可能触发多个后台 Goroutine 去查询数据库、调用其他微服务等。如果客户端断开了连接,服务器应该能够取消这些后台任务。
  2. 超时控制 (Timeout/Deadline Management):

MySQL RR 中依然存在幻读的场景

MySQL 的 REPEATABLE READ (RR) 隔离级别通过临键锁 (Next-Key Lock) 机制,在很大程度上解决了幻读问题。不过在某些特定场景下,“幻读”现象依然会发生。

MySQL学习笔记

mysql学习理解+ 课程笔记: 黑马程序员 https://www.bilibili.com/video/BV1Kr4y1i7ru/?share_source=copy_web&vd_source=e43c1de8e41e1499f7f3fdb03fba0eb6 黑马程序员 MySQL数据库入门到精通,

特别感谢:

基础篇

  • DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)
  • DML: 数据操作语言,用来对数据库表中的数据进行增删改
  • DQL: 数据查询语言,用来查询数据库中表的记录
  • DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限

数据定义语言

golang 垃圾回收

GC使用的方法是并发三色标记加上混合写屏障

  • 堆内存增长:当堆内存使用量达到上次GC后的2倍时触发(默认配置为100%)
  • 定时触发:默认2分钟强制触发一次GC
  • 手动触发:调用runtime.GC()

Go使用三色并发标记清除算法

KRPC请求格式

所有的 KRPC 消息都是通过 UDP 传输的、经过 Bencode 编码的字典。 本文主要介绍find_nodeget_peersannounce_peer 这三个 RPC 调用的请求和响应消息结构。

通用结构元素:

  • t: 事务 ID (Transaction ID),二进制字符串,由请求方设置,响应方必须在响应中原样返回。
  • y: 消息类型 (Message Type),单个字符,‘q’ 代表查询 (Query),‘r’ 代表响应 (Response),’e’ 代表错误 (Error)。
  • v (可选): 客户端版本信息 (Version),通常是字符串。
  • ip (可选,通常在响应中出现): 响应者看到的请求者的公网 IP 地址和端口 (紧凑的 6 字节二进制字符串)。

目的: 向一个节点请求,获取它所知道的、其 Node ID 在 XOR 距离上最接近指定 target Node ID 的 k 个节点的联系信息。这主要用于路由表的填充和更新,以及在其他查找(如 get_peers)中进行迭代查询。 find_node 请求用于询问某个节点:“请告诉我你认识的、离 target 这个 Node ID 最近的那些节点是谁?”。响应则直接返回一个包含这些节点(最多 k 个)联系信息的紧凑字符串。这个 RPC 是 DHT 网络进行节点发现和路由的基础。

KRPC

好的,我们来详细介绍一下 KRPC 协议。这是 BitTorrent Mainline DHT 网络中节点之间进行通信所使用的协议。 KRPC 是 BitTorrent DHT 的基石通信协议。它利用 UDP 的高效性和 Bencode 的简洁性,定义了一套清晰的查询/响应机制(ping, find_node, get_peers, announce_peer)以及错误处理方式