Go底层探索(五):哈希表map下篇-扩容
1.介绍
随着哈希表中元素的逐渐增加,哈希的性能会逐渐恶化,所以我们需要更多的桶和更大的内存来保证哈希的读写性能。
2.如何触发
在每次对哈希表赋值时,都会调用 runtime.mapassign 函数,该函数每次都会判断是否需要扩容,主要有两个函数:overLoadFactor和tooManyOverflowBuckets:
随着哈希表中元素的逐渐增加,哈希的性能会逐渐恶化,所以我们需要更多的桶和更大的内存来保证哈希的读写性能。
在每次对哈希表赋值时,都会调用 runtime.mapassign 函数,该函数每次都会判断是否需要扩容,主要有两个函数:overLoadFactor和tooManyOverflowBuckets:
Go语言中的map又被称为哈希表,是使用频率极高的一种数据结构。哈希表的原理是将多个键/值(key/value)对,分散存储在桶(buckets)中。
@注:以下内容来自《Go语言底层原理剖析》、《Go语言设计与实现》书中的摘要信息,本人使用版本(Go1.19)与书中不一致,源码路径可能会有出入。
@注:以下内容来自《Go语言底层原理剖析》书中的摘要信息,本人使用版本(Go1.19)与书中不一致,源码路径可能会有出入。
@注: 以下内容来自本人学习《Go语言底层原理剖析》书中的摘要信息。另外这本书中使用的Go是老版本,我使用的版本是Go1.19,有时候源码路径可能会不一样
本文将会介绍两种rocketmq扩展包,如下(截止到2022.10.04):
| 包 | 文档 | Star 数量 | 说明 |
|---|---|---|---|
| apache/rocketmq-client-go | https://github.com/apache/rocketmq-client-go | 979 | apache官方提供 |
| aliyunmq/mq-http-go-sdk | https://github.com/aliyunmq/mq-http-go-sdk | 50 | aliyun.mq提供 |
|
|
rocketmq-client-go 的生产者封装文件位置:app/rocketmqpkg/produce.go
gRPC 中的截取器,类似中间件( middleware )的功能,可以做一些前置校验的工作,比如登陆验证、日志记录、异常捕获等。
gRPC 中的 grpc.UnaryInterceptor 和 grpc.StreamInterceptor 分别对普通方法和流方法提供了截取器的支持。这里主要编写普通方法的截取器。
gRPC 为每个 gRPC 方法调用提供了 token 认证支持,可以基于用户传入的 token 判断用户是否登录、以及权限…,实现 token 认证的前提是,需要定义一个结构体,并实现 grpc.PerRPCCredentials 接口。
ProtoBuf 是 Protocol Buffers 的简称,它是Google开发的一种数据描述语言,于2008年开源。 ProtoBuf 刚开源时的定位类似于 XML、JSON
等数据描述语言,通过附带工具生成代码并实现将结构化数据序列化的功能。
gRPC 是一个高性能、开源、通用的 RPC 框架,由 Google 推出,基于 HTTP2 协议标准设计开发,默认采用 Protocol Buffers 数据序列化协议,支持多种开发语言。 gRPC 提供了一种简单的方法来精确地定义服务,并且为客户端和服务端自动生成可靠的功能库。