03 2024 档案
摘要:本文介绍了分布式系统中的一致性模型,包括严格一致性、顺序一致性和因果一致性。同时讨论了数据一致性和操作一致性,如单调读一致性、单调写一致性、写后读一致性和读后写一致性等概念。
阅读全文
摘要:时间轮(TimeWheel)是用于任务调度的数据结构,允许固定时间间隔调度任务。该Go代码提供了一个简单的时间轮实现,包括任务接口、时间节点和时间轮结构体,以及启动、停止、循环和添加任务等功能。
阅读全文
摘要:本文探讨了在并发环境下多级缓存可能存在的一致性问题,提出了针对读和写/更新操作的解决方案,包括分布式锁和 NO TTL 策略,旨在保证数据一致性和减小对底层数据库的负载。
阅读全文
摘要:atomic.CompareAndSwapInt64 汇编 这段代码稍微有些复杂, 我们来慢慢的分析 MOVQ $0x1, 0(AX) 这一步是为了给i赋值 MOVQ AX, CX 将i的地址传入了CX寄存器 MOVL $0x2, AX 将 立即数2 存入AX寄存器, A
阅读全文
摘要:atomic.SwapInt64 汇编 不再浪费时间去找源码了, 因为atomic这部分的实现全部都依赖于底层的汇编指令 会发现一件事情, 那就是这里的实现和Store是几乎一致的, 为什么呢? 原因出在XCHG XCHG XCHG 是x86架构汇编语言中的一条指令,它的全称是“Excha
阅读全文
摘要:该文章介绍了Go语言中atomic.StoreInt64函数的底层实现。通过汇编指令XCHG来实现原子性地修改存储的值,展示了底层结构对上层建筑的影响。XCHG指令在多线程编程中具有重要作用,但在一些旧计算机上性能不佳。
阅读全文
摘要:LoadInt64函数实际上是通过寻址来获取最新的值,寻址操作的本质即间接引用存储地址。在当前计算机体系下,并发更多是由写操作引起,而读操作通常不存在并发冲突。
阅读全文
摘要:前言 在atomic中, 常用的有这么几类操作 Add: 增加值 CAS: 比较, 如果old符合预期就替换为new Load: load当前最新的值 Store: 将当前值直接写入到内存中 需要注意的是, 以上操作全部都是原子性的. 对于指令来说, 是不区分类型的, 只区分位数, 而32位只是64
阅读全文
摘要:atomic.AddInt64 介绍 原理 源码 看不到源码解释个勾八原理 源码里只有函数doc, 但是没有函数实现, 但是有一段注释 // AddInt64 atomically adds delta to *addr and returns the new value. // Consider
阅读全文
摘要:golang: 分析查看汇编代码 查看可执行文件 可视化 注意: linux用户需要额外运行go install --tags nowayland loov.dev/lensm@main 下载 lensm: go install loov.dev/lensm@main 运行lensm: lens
阅读全文
摘要:代码优化 多线程优化 尽量使用顺序读写 因为分支预测的关系, 顺序读写通常能够带来更好的性能. 共享变量 将只读变量和读写变量分离 有可能因为缓存行的原因导致读写变量的更新影响到读变量, 进而影响了运行速度 提升数据的局部性, 将一起使用的读写变量分组到一个结构中 缓存行Padding (谨慎使用)
阅读全文
摘要:NUMA架构是一种多处理器系统内存设计,提供本地内存访问和远程内存访问,用于提高处理器访问内存的速度。在服务器、虚拟化环境、HPC和多线程应用中广泛应用。优化方法包括进程绑定、缓冲池配置和开启NUMA优化功能。
阅读全文
摘要:虚拟内存使用基址加界限、基于段和基于页等不同方法进行地址转换。基址加界限简单但存在内存浪费,碎片问题;基于段实现内存保护和共享,但存在内部碎片和大小调整问题;基于页是现代操作系统常用的技术,通过页表完成地址映射,避免了段的缺点。
阅读全文
摘要:CPU Cache 架构 每个程序员都应该了解的内存知识.pdf - p22 - 每个程序员都应该了解的内存知识-P22-20240328112647 每个程序员都应该了解的内存知识.pdf - p23 - 每个程序员都应该了解的内存知识-P23-20240328112807 每个程序员
阅读全文
摘要:南桥&北桥&内存 结构 每个程序员都应该了解的内存知识.pdf - p5 - 每个程序员都应该了解的内存知识-P5-20240327103419 功能 每个程序员都应该了解的内存知识.pdf - p5 - 每个程序员都应该了解的内存知识-P5-20240327104347 北桥 主要是连
阅读全文
摘要:sync.Once sync.Once 因为Once实在是太常用了, 所以今天就对Once的源代码做一个简单的分析 package sync import ( "sync/atomic" ) type Once struct { done uint32 // 标识是否已运行 m Mutex } fu
阅读全文
摘要:go: embed go:embed 是 Go 语言在其 1.16 版本中引入的一个新功能,它允许开发者在编译时将文件或文件夹嵌入到 Go 程序中。这样做可以简化资源文件的分发,因为它们会被编译到可执行文件里,避免了在运行时需要处理文件路径和分发额外文件的问题。 要使用 go:embed,你需
阅读全文
摘要:Go: bytebufferpool源码分析 项目地址: https://github.com/valyala/bytebufferpool 简介 bytebufferpool被广泛用于对于字节流的读取, 在gnet, fasthttp 等网络库中都有大量使用. 本文将探究其实现. 结构 项目主要分
阅读全文
摘要:go-buffer-pool go-buffer-pool package pool import ( "math" "math/bits" "sync" ) // GlobalPool is a static Pool for reusing byteslices of various sizes
阅读全文
摘要:跳表与二叉搜索树 跳表与二叉搜索树 本文探索跳表与二叉搜索树的一些相似之处, 以此来加深对跳表结构的深入理解 适用场景 跳表在Redis中有比较广泛的使用Redis 技术要点 我们可以认定跳表本质上就是一个平衡二叉搜索树, 跳表的目标是为了能够快速的定位key所在的index 所以可以认定的是跳表的
阅读全文
摘要:指数退避算法用于自旋锁,尝试CAS获取锁失败后会等待递增的时间片再次尝试,以减少竞争。backoff值指数递增,等待时间随之增加,提高尝试成功率。
阅读全文
摘要:该文章介绍了如何实现无锁队列,通过使用CAS操作和指针相等判断来确保并发安全。无锁队列适用于需要高效处理并发情况下的队列操作,具有较高的性能和并发性。
阅读全文
摘要:本文探讨了PR(Pull Request)和MR(Merge Request)的区别,PR源自GitHub,适用于向自己没有权限的项目提交合并请求;MR源自GitLab,可以指定源仓库、源分支、目标仓库和目标分支,更具体直观。建议在开源项目中使用PR,在公司内部使用GitLab时可以使用MR。
阅读全文
摘要:本文介绍了在 Go 语言中使用反射时需要注意的一些问题,包括针对结构体和指针调用方法的差异、通过反射调用方法时的规则、指针与实例的区别以及为什么应该使用指针而不是实例等关键内容。另外,还提到了在反射中使用指针无法修改值的情况。
阅读全文
摘要:Go数组的扩容规则是先双倍扩容,然后根据一定比例逐渐向1.25靠近。在小于256时会进行双倍扩容,在大于256时根据生长因子扩容,最终趋近于1.25。扩容过程中需注意内存溢出情况。
阅读全文
摘要:通过chan来实现并发访问控制,演示了如何使用channel来实现实例的并发访问,当chan为空时,尝试读可以成功,获得的结果为空。
阅读全文
摘要:本文介绍了使用Go语言操作etcd的基本功能,包括建立连接、Get/Set操作、Lease租约管理和Watch监控功能。通过示例代码演示了如何进行基本的键值存储、租约控制和实时监控等操作。
阅读全文
摘要:本文介绍了使用etcd实现简单分布式锁的设计方案,通过键值对的revision来判断锁的创建和释放状态。实现了Lock上锁、Unlock解锁功能,并提供Watch-Dog模式。
阅读全文
摘要:etcd 以及 redis分布式锁的实现优劣比较 背景介绍 在学习etcd时, 对于使用etcd实现分布式锁(使用etcd来实现一个简单的分布式锁)做了一个简单的示例, 同时也能想到和Redis实现的分布式锁相比, 基于etcd来做有什么好处呢? 技术要点 底层技术比较 我们必须要明白一件事情, 两
阅读全文
摘要:本文简要介绍了思源基本配置中的背景颜色、横向菜单样式、选中页签样式和引用样式
阅读全文
摘要:本文介绍了如何使用Scoop来管理个人配置,包括安装和配置aria2、git,导出和导入软件列表等操作。同时提供了参考的scoop.json文件和scoop list列表,以及安装所有软件的命令示例。
阅读全文
摘要:Redis: 锁 单机悲观锁 参考实现 流程 加锁, 如果失败, 则放弃或重试 占用, 业务逻辑 释放 实现 INCR: 通过返回结果是不是 0 SETNX: 通过判断结果是否为 0 MSETNX: 一次性获取多个key的占用 Redis: msetnx 乐观锁 定义 乐观锁并不会直接对
阅读全文
摘要:该文章介绍了 Golang 中的 Redislock 源码分析,主要分析了实现中使用的 Lua 脚本以及 Golang 的基本结构。通过 Lua 脚本实现了获取锁、刷新锁、释放锁和获取锁的 TTL 等功能。
阅读全文
摘要:Redis缓存常见问题和注意事项:更新策略、缓存穿透、缓存雪崩、缓存击穿。解决方案包括设置过期时间、缓存空对象、预热、降级兜底等。
阅读全文
摘要:linux: nohup & 重定向 背景 今天在进行一些spark-hive的操作时, 因为对此完全不了解, 所以找好兄弟咨询了下, 他给了我一串我完全看不懂的shell命令, 本文就是专门用来解释这个命令的 问题 nohup以及 > 代码 这段神奇的代码: nohup spark-hiv
阅读全文
摘要:snowflake算法时钟回拨问题: 基于逻辑时钟解决方案 问题 时间的生成完全依赖于本地时钟, 在开启NTP协议的情况下, 可能出现时钟回拨现象, 此时服务不可用 为了防止ID被顺序破解, 通常自增值不会 递增1, 可以更加随机的添加递增值 解决方案 我们需要知道, 时钟回拨问题是一个对于分布式服
阅读全文
摘要:后端服务获取客户端IP的一些注意事项 #Gin# #HTTP# #WEB# 背景 在典型的WEB后端服务中, 怎样才能获取到客户端IP呢? 同事最近在尝试进行负载均衡时, 有一个这样的需求. 但是需要注意的是, 在现在越来越负载的网络环境中, 真的能够准确的获取客户端IP吗? 方案 首先我们
阅读全文