Golang
Kaimar
⚽⚽⚽
展开
-
【分布式缓存源码分析】总结篇
文章目录1.流程1.1 流程回顾1.2 远程访问分布式节点2.参考上一节解决了访问哪个节点的问题,即选择哪个分布式节点获取缓存值,本节实现分布式节点注册和与远程节点的服务端通信。1.流程1.1 流程回顾 是接收 key --> 检查是否被缓存 -----> 返回缓存值 ⑴ | 否 是 |-----> 是否应当从原创 2022-03-24 21:01:20 · 1052 阅读 · 1 评论 -
【分布式缓存源码分析】一致性哈希(五)
文章目录1.什么是一致性哈希2.为什么使用一致性哈希2.1 问题一:普通哈希的扩展性问题(新加节点)2.2 问题二:普通hash的容错性问题(节点下线)2.3 一致性哈希优化2.4 虚拟节点3.代码实现4.验证5.总结参考前面已经首先实现了LRU缓存,然后基于LRU缓存进行了并发访问控制、控制缓存值存储和获取的流程,并对缓存值进行了抽象与封装,其次基于分布式架构,实现了分布式节点相互访问的HTTP服务端。1.什么是一致性哈希对于分布式存储,不同机器上存储不同对象的数据,那么该使用什么方式去找到目原创 2022-02-25 16:58:05 · 502 阅读 · 0 评论 -
【分布式缓存源码分析】HTTP服务端(四)
文章目录1.HTTP服务端2.代码注释1.HTTP服务端为什么需要建立HTTP服务端?这是一个分布式缓存,有很多个分布式的节点,节点之间需要进行通信,那么这里采用HTTP通信,也有其他的方式如RPC等。如果一个节点启动了它的HTTP服务端,那么它就可以被其他节点访问。2.代码注释核心代码是ServeHTTPpackage geecacheimport ( "fmt" "log" "net/http" "strings")/* 本文件提供被其他节点访问的能力(基于htt原创 2022-02-23 23:17:13 · 335 阅读 · 0 评论 -
【Golang】数组、切片、new、make、复合字面原理分析
引言我是刷题的时候进行一些参数传递遇到了一些问题,然后查阅地址发现它们的比较有点零散,所以对上述问题做一个我自己的总结阐述,有问题还需大家指出。数组与切片首先我们要明白,在go中数组是值类型,切片是引用类型,这点很重要!通常我们就会涉及到他们的初始化,记住一个重要的特征数组初始化要指定大小,而切片不用!,且使用make的一定是切片,因为make只能用于引用类型的初始化!// 数组初始化的几种方式var arr [3]int // 声明数组var arr = [3]int{1, 2, 3}.原创 2022-01-23 12:02:28 · 1227 阅读 · 1 评论 -
【Golang】高性能编程之sync.Cond
文章目录1. sync.Cond1.1 条件变量1.2 与sync.Mutex的区别1.3 应用场景2. 使用方法2.1 NewCond创建实例2.2 Broadcast广播唤醒所有2.3 Signal唤醒一个协程2.4 Wait等待3. 示例参考1. sync.Cond1.1 条件变量sync.Cond 条件变量用来协调想要访问共享资源的那些 goroutine,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻塞的 goroutine。sync.Cond定义每个 Cond 实例都会关联原创 2021-12-21 20:32:36 · 752 阅读 · 0 评论 -
【Golang】高性能编程之sync.Once
文章目录1. sync.Once1.1 原理1.2 作用1.3 init函数1.4 sync.Once与init函数对比1.5 sync.Once的使用场景2. 使用方法参考1. sync.Once1.1 原理特性:保证变量仅被初始化一次,线程安全,支持并发。保证变量仅被初始化一次,需要有个标志来判断变量是否已初始化过,若没有则需要初始化。线程安全,支持并发,无疑需要互斥锁来实现。type Once struct { done uint32 m Mutex}1原创 2021-12-21 20:06:13 · 671 阅读 · 0 评论 -
【Golang】高性能编程之sync.Pool
文章目录1. sync.Pool2. sync.Pool的使用场景3. sync.Pool的使用3.1 声明对象池3.2 Get & Put3.3 示例fmt.Printf参考1. sync.Poolsync.Pool 是可伸缩的,同时也是并发安全的,其大小仅受限于内存的大小。sync.Pool 用于存储那些被分配了但是没有被使用,而未来可能会使用的值。这样就可以不用再次经过内存分配,可直接复用已有对象,减轻 GC 的压力,从而提升系统的性能。sync.Pool 的大小是可伸缩的,高负载时会原创 2021-12-21 17:42:24 · 544 阅读 · 0 评论 -
【Golang】高性能编程之垃圾回收机制
1. Go 语言GC(垃圾回收)的工作原理最常见的垃圾回收算法有标记清除(Mark-Sweep) 和引用计数(Reference Count),Go 语言采用的是标记清除算法。并在此基础上使用了三色标记法和写屏障技术,提高了效率。标记清除收集器是跟踪式垃圾收集器,其执行过程可以分成标记(Mark)和清除(Sweep)两个阶段:标记阶段 — 从根对象出发查找并标记堆中所有存活的对象;清除阶段 — 遍历堆中的全部对象,回收未被标记的垃圾对象并将回收的内存加入空闲链表。标记清除算法的一大问题原创 2021-12-17 15:36:14 · 1279 阅读 · 0 评论 -
【Golang】高性能编程之退出协程的其他场景
文章目录1. channel 忘记关闭的陷阱2. 通道关闭的原则参考1. channel 忘记关闭的陷阱func do(taskCh chan int) { for { select { case t := <-taskCh: time.Sleep(time.Millisecond) fmt.Printf("task %d is done\n", t) } }}func sendTasks() { taskCh := make(chan int, 10) go原创 2021-12-14 15:38:32 · 474 阅读 · 0 评论 -
【Golang】高性能编程之超时退出协程
超时控制在网络编程中是非常常见的,利用 context.WithTimeout和time.After都能够很轻易地实现。func doBadthing(done chan bool) { time.Sleep(time.Second) done <- true}func timeout(f func(chan bool)) error { done := make(chan bool) go f(done) select { case <-done: fmt.Prin.原创 2021-12-14 15:22:11 · 1301 阅读 · 0 评论 -
【Golang】高性能编程之读写锁
互斥锁是两个代码片段相互排斥,Go中提供sync.Mutex互斥锁类型,有两个方法:Lock加锁和Unlock释放锁。读写锁是没有写锁下,允许多个读锁,读操作不互斥。但是写锁之间互斥,并且写锁和读锁是互斥的。Go中提供sync.RWMutex和四个方法:Lock 加写锁、Unlock 释放写锁、RLock 加读锁、RUnlock 释放读锁。读写锁的存在是为了解决读多写少时的性能问题,读场景较多时,读写锁可有效地减少锁阻塞的时间。...原创 2021-12-14 15:02:20 · 1502 阅读 · 0 评论 -
【Golang】高性能编程之空结构体
总共叙述了空结构体的三个用途,实现Set、不发送数据的channel、仅包含方法的结构体。参考Go 空结构体 struct{} 的使用原创 2021-12-13 20:02:18 · 122 阅读 · 0 评论 -
【Golang】高性能编程之for和range
Go 语言中,range 可以用来很方便地遍历数组(array)、切片(slice)、字典(map)和信道(chan)。有一种情况,就是在遍历的时候同时修改原数据,如添加和删除。对于数组和切片进入循环时只会计算一次循环的次数,如下:性能对比range 在迭代过程中返回的是迭代值的拷贝,如果每次迭代的元素的内存占用很低,那么 for 和 range 的性能几乎是一样,例如 []int。但是如果迭代的元素内存占用较高,例如一个包含很多属性的 struct 结构体,那么 for 的性能将显著地高于 ra.原创 2021-12-13 17:24:44 · 638 阅读 · 0 评论 -
【Golang】高性能编程之切片
切片slice的底层是数组。所以提到切片就会讲到它与数组的区别。1.在Go中,数组是值类型,而切片是引用类型。在C中数组是引用类型,因此在Go中传递数组的时候实际上是复制了整个数组,所以想通过传递的数组修改原数组元素是改不了的,因为改到的是副本。而对于切片而言就相反,它不会复制,而是直接在原底层数组操作。2.在创建时,两者也有明显的区别。数组在创建时必须指定大小,而切片不用,并且切片可以使用make来创建。切片的操作及性能性能陷阱在已有切片的基础上进行切片,不会创建新的底层数组,使用的都是.原创 2021-12-13 16:55:27 · 263 阅读 · 0 评论 -
【Golang】高性能编程之字符串拼接
go的拼接方式有很多种,这里讲常用的两种,一个常用的就像Python使用+,然后另一个是官方推荐的strings.Builder。+适用于普通的小字符串,因为在Go中,字符串是不可变类型,拼接是又开辟了新的内存空间,所以如果字符串很长,效率上会有问题。s1 += s2;s = s1 + s2;strings.Builder就是官方综合易用性和性能推荐的方法,它的底层是[]byte数组。通常和strings.Builder比较的方法是bytes.Buffer方法,他们两者底层都是[]byte.原创 2021-12-13 16:14:18 · 664 阅读 · 0 评论 -
【问题解决】panic: qtls.ClientHelloInfo doesn‘t match goroutine 1 [running]: github.com/marten-seemann/qt
在跑Go代码的时候报错,如下问题panic: qtls.ClientHelloInfo doesn't matchgoroutine 1 [running]:github.com/marten-seemann/qtls-go1-15.init.0() github.com/marten-seemann/qtls-go1-15@v0.1.1/unsafe.go:20 +0x168原因go的版本问题,这个qtls是在go1.15版本下build的项目,所以如果版本与它不匹配就.原创 2021-11-01 12:05:04 · 2193 阅读 · 0 评论 -
【Golang】 race detected during execution of test问题解决
背景我是在调试MIT6.824的Raft实验遇到的这个问题,经过查阅资料,判断是由于多个goroutine资源竞争,没有加锁的问题。解决办法就是在竞争的资源前面加锁,就可以避免出现这个问题。rf.mu.Lock()defer rf.mu.Unlock()DPrintf("[%s]: Id %d Term %d State %s\t||\tiAppendEntries RPC"+ " to peer %d Success!\n", name, rf.me, rf.currentTerm, .原创 2021-09-22 16:46:49 · 1271 阅读 · 0 评论 -
【Golang】Golang 入门 : channel(通道)
【转载出处】作者:sparkdev出处:http://www.cnblogs.com/sparkdev/转载 2021-09-14 17:02:34 · 98 阅读 · 0 评论 -
【Golang】Golang 入门 : 竞争条件
【转载出处】作者:sparkdev出处:http://www.cnblogs.com/sparkdev/转载 2021-09-14 17:00:57 · 98 阅读 · 0 评论 -
【Golang】Golang 入门 : goroutine(协程)
【转载出处】作者:sparkdev出处:http://www.cnblogs.com/sparkdev/转载 2021-09-14 16:59:12 · 105 阅读 · 0 评论 -
【Golang】Golang 入门 : 理解并发与并行
【转载出处】作者:sparkdev出处:http://www.cnblogs.com/sparkdev/转载 2021-09-14 16:57:41 · 100 阅读 · 0 评论 -
【Golang】Golang 入门 : 等待 goroutine 完成任务
【转载出处】作者:sparkdev出处:http://www.cnblogs.com/sparkdev/转载 2021-09-14 16:56:14 · 130 阅读 · 0 评论 -
【Golang】Golang 入门 : 结构体(struct)
【转载出处】作者:sparkdev出处:http://www.cnblogs.com/sparkdev/转载 2021-09-14 16:54:34 · 106 阅读 · 0 评论 -
【Golang】Golang 入门 : 映射(map)
【转载出处】作者:sparkdev出处:http://www.cnblogs.com/sparkdev/转载 2021-09-14 16:52:34 · 113 阅读 · 0 评论 -
【Golang】Golang 入门 : 切片(slice)
【转载出处】作者:sparkdev出处:http://www.cnblogs.com/sparkdev/转载 2021-09-14 16:49:51 · 122 阅读 · 0 评论 -
【Golang】Golang 入门 : 数组
数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int、string 等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。在 Golang 中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说 [5]int 和 [10]int 是两个不同的类型。Golang 中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速...转载 2021-09-14 16:46:49 · 57 阅读 · 0 评论