- 博客(13)
- 收藏
- 关注
原创 grpc测试工具-bloomgrpc
最近项目涉及到grpc的使用,之前用的是在客户端再包一层gin框架使用postman测试,很复杂效果不好。经过推荐知道了好用的grpc调试工具,写一篇文档记录一下并给有需要的人推荐。本文向大家推荐一个好用的grpc调试工具,BloomRPC。主要包括使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
2023-04-20 14:57:54
1167
原创 微服务:go-microv4服务注册与发现+consul服务
因为项目需要,要使用go-micro框架,将已经实现的网站功能转到微服务里面实现,所以经过了许许多多踩坑之后终于实现了初步的demo。本文会记录实现过程和中间遇到的问题,希望能帮助到大家。
2023-04-10 15:07:46
890
3
原创 MVCC原理
在并发事务中,为了解决脏读、幻读、不可重复读的问题,实现的解决方案,用于提供事务隔离。对于「读提交」和「可重复读」隔离级别的事务来说,它们是通过 Read View 来实现的,它们的区别在于创建 Read View 的时机不同。下面讲解InnoDB中的MVCC实现机制。
2023-04-01 18:21:19
179
原创 数据库:事务
脏读:A读取B未提交的数据,如果B回滚,则数据无效。不可重复读:A读取B,但是B更新了字段,导致A读的数据不同。幻读:A读取B,但是B插入了字段,导致A读取的时候有额外的数据。多个并发事务执行的时候,会出现脏读、不可重复读、幻读的现象,为了规避这种现象,SQL提供了四种隔离级别来规避上述问题。隔离级别越高,性能效率就越低。读未提交,读已提交,可重复度,串行化读未提交:事务A可 以读取到事务B未提交的数据,可能会出现脏读问题。
2023-04-01 18:12:42
106
原创 TCP与UDP
1.为了避免历史连接,防止旧的重复连接初始化造成混乱。因为网络阻塞,导致之前发送的连接消息没有到达服务器端,这是客户端会重新发送新的syn字段,如果这时旧的syn字段到达了服务器端,就会跟客户端建立连接,造成了资源的浪费。2.为了同步序列号,第二次连接的时候服务器端发送初始序列号给客户端,需要客户端的应答。这样才能保证双方的序列号可靠的同步。
2023-03-24 14:57:42
164
原创 go中的sync.mutex与RWMutex
当V的值等于A时,CAS会将V的值更新为B。CAS操作是一种无锁算法,它比传统的锁算法更加高效,因为它不需要获取锁来保证操作的原子性。新来的 goroutine 将不会尝试去获得锁,即使锁看起来是 unlock 状态, 也不会去尝试自旋操作,而是放在等待队列的尾部。②当一个读者读完的时候,readCount-1,readerWait-1,如果readerWait==0则说明是最后一个读者,可以使写进程执行写操作。③.当一个协程释放锁时,它会通过原子操作将sema值减1,并唤醒等待队列中的一个协程。
2023-03-19 23:04:30
140
原创 go 垃圾回收
在早期go语言的垃圾回收策略是“Stop The World”,就是需要停止所有的go协程,扫描整个内存空间,这样会导致性能大幅的下降,所以接下来就有新的gc策略。缺点:会悲观的认为所有删除的对象都可能被黑色对象引用,会导致本该删除的垃圾对象会在本轮存活。就如同名字一样:标记清除就是先标记所需要的垃圾回收对象,然后对标记的对象实施清除。4.不断的重复步骤3,一直到灰色对象为空,剩下的白色对象就是清除地对象。三色标记法也存在并发问题,主要有两种,一种是删除问题,一种是插入问题。
2023-03-19 22:54:52
136
原创 go-defer
当 panic 发生时,程序停止当前的执行并开始展开堆栈,执行所有延迟函数,直到到达堆栈顶部。①开放编码:如果defer语句在编译的时候就可以固定,就直接改写用户代码,将defer语句放入函数末尾,这种效果最好但是能优化的可能性最小。①堆上分配(大部分情况):在堆上开辟一个sched.deferpool,遇到defer语句就将信息放进这个pool里面,在p结构体里面。是 Go 中的另一个内置函数,可用于从 panic 中恢复。②:栈上分配:遇到defer语句,将信息放到栈上,函数返回的时候从栈中取出执行。
2023-03-19 22:52:05
48
原创 sync.map
总结:sync.map使用了两个map,分离了扩容问题,实现map的并发性。在不会引发扩容问题的操作(查改)使用readmap在会引发扩容问题的操作(新增)使用dirtymap。
2023-03-19 22:32:41
339
原创 go.map
map的底层结构是一个hash表,对于碰撞使用拉链法实现,其中的数据结构如下所示1.每个桶是一个bmap struct,其中每个桶可以装载8个k-v值,overflow指向溢出桶,如果桶装满了就会指向下一个bmap2.如果按照 将k-v放在一起存储,那在每一个 key/value 对之后都要额外 padding 7 个字节;而将所有的 key,value 分别绑定到一起,成为两个数组存储,则只需要在最后添加 padding。
2023-03-19 22:18:31
52
原创 go routine与GMP模型
M:表示系统线程的抽象,拥有计算资源执行代码。G需要调度到M上才能执行,M才是真正工作的实体。当M没有工作的时候,在休眠之前会自旋的寻找工作,检查全局队列,查看networkpoller或者进行工作窃取。部分源码如下//m代表工作线程,保存了自身使用的栈信息 type m struct {// 记录工作线程使用的栈信息,在执行调度代码时候需要使用 // 执行用户goroutine代码的时候,使用用户自己的栈,所以调度的时候会发生栈的切换 g0 * g。
2023-03-19 22:08:01
179
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人