Go 中 Context 包
上下文 context.Context
在 Go 语言中被用来设置截止日期、同步信号,传递请求相关值的结构体。上下文与 goroutine 有比较密切的关系,是 Go 语言中的独特设计。
使用场景
如下代码,每次请求,Handler
会创建一个 goroutine 来为其提供服务,而且连续请求3次,request
的地址也是不同的:
func main() {
http.HandleFunc("/", SayHello) // 设置访问的路由
log.Fatalln(http.ListenAndServe(":8080",nil))
}
func SayHello(writer http.ResponseWriter, request *http.Request) {
fmt.Println(&request)
writer.Write([]byte("Hello world"))
}
========================================================
$ curl http://localhost:8080/
0xc00012a030
0xc000010018
0xc000010028
go 常用基本类型源码设计分析
Go 内存管理与垃圾回收
Go 语言抛弃了 C/C++ 中的开发者管理内存的方式:主动申请与主动释放,增加了逃逸分析和 GC,这样开发者就能从内存管理中释放出来,有更多的精力去关注软件设计,而不是底层的内存问题。这是 Go 语言成为高生产力语言的原因之一。
goroutine 调度器原理
Protobuf
Protobuf 概述
Protocol Buffer (简称Protobuf) 是Google出品的性能优异、跨语言、跨平台的序列化库。
2001年初,Protobuf 首先在 Google 内部创建, 我们把它称之为 proto1
,一直以来在 Google 的内部使用,其中也不断的演化,根据使用者的需求也添加很多新的功能,一些内部库依赖它。几乎每个 Google 的开发者都会使用到它。
Google 开始开源它的内部项目时,因为依赖的关系,所以他们决定首先把 Protobuf 开源出去。 proto1 在演化的过程中有些混乱,所以Protobuf 的开发者重写了 Protobuf 的实现,保留了 proto1 的大部分设计,以及 proto1 的很多的想法。但是开源的 proto2 不依赖任何的 Google 的库,代码也相当的清晰。2008年7月7日,Protobuf 开始公布出来。
Protobuf 公布出来也得到了大家的广泛的关注, 逐步地也得到了大家的认可,很多项目也采用 Protobuf 进行消息的通讯,还有基于 Protobuf 的微服务框架 GRPC。在使用的过程中,大家也提出了很多的意见和建议,Protobuf 也在演化,于 2016 年推出了 Proto3。 Proto3 简化了 proto2 的开发,提高了开发的效能,但是也带来了版本不兼容的问题。
Protocol Buffer 名称来自于初期一个主要的类的名称 ProtocolBuffer
。
Elasticsearch 倒排索引原理
倒排索引也是索引的一种。索引,本质上就是为了快速检索我们存储的数据。
每种数据库都有自己要解决的问题(或者说擅长的领域),对应的就有自己的数据结构,而不同的使用场景和数据结构,需要用不同的索引,才能起到最大化加快查询的目的。
对于 MySQL 来说,使用 B+ tree 索引是为了优化已有数据的存储结构,对于不需要快速更新的时候,采用预先排序等方式换取更小的存储空间,更快的检索速度,但同时,由于每次更新都需要对 B+ 树进行调整,导致更新比较慢。Elasticsearch 是通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好。
Elasticsearch 是建立在全文搜索引擎库 Lucene 基础上的搜索引擎,它隐藏了 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API,不过掩盖不了它底层也是 Lucene 的事实。
Elasticsearch 的倒排索引,其实就是 Lucene 的倒排索引。