勿在浮沙筑高台
  • 首页
  • 归档
  • 分类
  • 标签
  • 作者
  •   
  •   

go逃逸分析

go 内存分配go 内存详细过程参考这篇: go内存分配与垃圾回收 go 会在堆(heap, 全局的堆空间用来动态分配内存)和栈(每个 goroutine 的 stack)两个地方分配内存。在函数中申请一个对象,如果分配在栈中,函数执行结束时自动回收,如果分配在堆中,则在函数结束后某个时间点进行垃圾回收。 在栈上分配和回收内存的开销很低,只需要 2 个 CPU 指令:PUSH 和 POP,一个是将
2025-05-15
go

go-channel底层原理

前言go channel 是 go 并发最核心的组件, 也体现 go 的并发思想: Do not communicate by sharing memory; instead, share memory by communicating. chanel 分为两类: 无缓冲channel,可以看作“同步模式”,发送方和接收方要同步就绪,只有在两者都 ready 的情况下,数据才能在两者间传输(
2025-04-30
go
#go-channel

权限系统设计

RBAC 与 ABAC
2025-04-27
系统设计

缓存设计问题杂谈

大规模系统中缓存设计需要考虑的问题
2025-02-01
系统设计

go锁mutex与RWMutex

sync.Mutexsync.Mutex 是 go 最基本的同步原语, 也是最常用的锁之一 基本结构12345// sync/mutex.go 25行type Mutex struct { state int32 sema uint32} state: 当前互斥锁的状态 sema: 控制锁状态信号量 state 一共32位, 最低三位分别表示 mutexLocked、mu
2024-12-12
go

使用redis作为延迟队列方案对比

背景项目中经常需要做某个操作, 然后一定时间之后看这个操作的执行结果。 要么使用定时任务扫描, 要么使用延时队列(任务)来实现。在主流的 MQ 中支持延时消息的有 RabbitMQ 和 RocketMQ, 如果没有使用这个两个 MQ, 譬如使用了 Kafka, 又想使用延时消息的功能可以使用 Redis来实现。 Redis 实现延时队列有三种方案: 基于 Zset(Sorted Set) 来实现
2024-11-12
中间件
#redis

go内存分配与垃圾回收

go 内存管理基本概念go 与 java类似, 都实现了自动内存管理。 Golang运行时的内存分配算法主要是 TCMalloc算法。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。 基本概念 Page
2024-10-14
go

unsafe.Pointer与uintptr

uintptr 一个足够大的无符号整型,用来表示内存地址的值,比如 0xffffffff 可以进行地址的数值计算 uintptr 可以和 int、int8、int32、uint8 等整型类型相互转换 使用示例: 12345678910func main() { var i int = 1 fmt.Println(uintptr(i)) fmt.Println(uint
2024-10-11
go

go map 原理与并发安全map

map 原理go map 整体和 java hashmap 差不多, 只是源码阅读的位置不太方便 map 的相关文件位于 GOROOT 的 runtime 包中的 map.go map 结构hmap12345678910111213141516171819202122232425// A header for a Go map.type hmap struct { // map中的
2024-10-09
go

MySQ之onlineDDL

DDL 的算法copyCOPY是MYSQL 5.5以及之前的默认算法,使用COPY算法会锁表,不支持online ddl,COPY算法在server层创建一个临时表用于copy数据,最后用新表替换旧表。 copy 算法的执行执行流程: 准备: 对表加 DML 读锁,读取元数据(DDL不并行,DML可以并行) 升级 DML 写锁(DDL和DML都不并行) 按照原表定义创建一个新的临时表 执行
2024-08-08
mysql
#mysql
123…10

搜索

Hexo Fluid