go
- RabitMQ
> 关于RabbitMQ
- gRPC
> gRPC GRPc RPC Remote Procedure Call 远程过程调用 封装网络请求,rpc负责打包参数,网络传输和解析回复 GRPC GRPC是google封装的rpc协议,通过protocol buffer和HTTP/2实现高效传输 protocol buffer 负责定义数据结构 proto的message里面真正二进制存储的是编号,字段修改不影响兼容 #name.proto message Name{ int id = 1; string n = 2; } service …
- context&interface
> 关于GO context context实际上是一个接口,提供了四种方法 Done(),Deadline(),Err(),Value(),可以在一个请求链路中,优雅地传递取消信号,超时,和截止日期,并且携带一些范围内的键值对数据 context主要解决三个问题:超时取消,请求信号传播,请求级数据传递 当超时发生时,所有子操作都会收到通知,立刻退出 可以传递请求级的原数据,比如用户id等 查找 context的查找是链式的,当前层级没有需要的key,就调用parent.Value()继续往上查找, …
- mutex
> 关于GO的mutex mutex 结构 type mutex struct { state int32 sema uint32 } state表示锁的状态,有锁定,被唤醒,饥饿状态 sema表示信号量,mutex阻塞队列的定位,实现groutine的阻塞和唤醒 模式 Mutex基本上有两种模式:饥饿模式和正常模式: 正常模式:新请求的锁会和头部等待的groutine竞争,在等待期间会自旋几次,如果此时锁资源恰好被释放,那么新的请求有概率抢到锁,这样头部等待的groutine可能需要等很久才能抢到 …
- Map和Channel
> 关于GO的Map和channel MAP map底层结构 type hmap struct { count int //map中元素的个数 flags uint8 //标志位,记录map状态 B uint8 //bucket数量 noverflow uint16 //溢出桶数量近似值 hash0 uint32 //hash种子 buckets unsafe.Pointer //指向bucket的指针 oldbuckets unsafe.Pointer //旧bucket nevacuate …
- Slice
> 关于GO的Slice slice和数组 Slice的底层是数组 数组大小是数组类型的一部分。[3]int和[4]int是两种不同类型的数组。数组是值类型,作为参数传递的时候会传递整个数组。数组需要指定大小,不指定则自动推算初始化大小。 Slice的底层也是数组,描述了底层数组的一个片段,包括指向数组的指针,容量和长度。切片在参数传递的时候按值传的是包含底层数组长度,容量,指针的副本,副本中的指针指向同一底层数组,所以在函数内,对底层数组的修改对调用函数方可见。切片可以通过数组或者make初始化 …
- Go!
> 关于GO Go 语言 并发和并行 并发:两个线程交替推进,看起来同时执行。 并行:两个线程在不同 CPU 核心上真正同时执行。 进程、线程和协程的区别 进程是操作系统进行资源分配和调度的基本单位,线程是 CPU 调度和执行的基本单位 同一进程内的线程共享一片进程的内存空间和大部分资源,但是拥有独立的栈,寄存器和程序计数器 进程: 进程是具有一定独立功能的程序,是资源调度和分配的最小单位。每个进程都有自己独立的内存空间,不同进程通过进程间通信来通信。由于进程比较重,占据独立的内存,所以上下文间的切 …
- MySQL引擎
> 关于MySQL引擎 5 MySQL里面的引擎是什么? 存储引擎决定 MySQL 如何存储数据、建立索引、读写数据以及是否支持事务、锁等功能。 MYSQL执行一条语句的过程 连接器:建立连接,校验连接,管理连接 查询缓存:如果命中缓存直接返回,否则继续查询。MySQL8.0版本后已经删除 解析SQL:通过解析器对SQL查询进行语法分析,建立语法树。语法树是对SQL语句的结构化分析,根据不同的token拆分。 优化器会基于这个树判断有没有索引?使用索引是否划算?然后综合成本更低的执行计划 执行 …