记一次 Golang 数据库查询组件的优化。

2021-10-28
阅读 7 分钟
4.7k
线上有一块业务,需要做大量的数据库查询以及编码落盘的任务。数据库查询20分钟左右,大约有2kw条sql被执行。如果可以优化数据库查询的方法,可以节省一笔很大的开销。

pika hash 结构解读

2021-02-01
阅读 9 分钟
3.7k
pika 是 360 开源的一个非关系型数据库,可以兼容 Redis 系统的大部分命令。支持主从同步。主要的区别是 pika 支持的数据量不受内存的限制,仅和硬盘大小有关。底层使用了RocksDB 做 KV 数据的存储。

Golang 限流器的使用和实现

2020-06-28
阅读 3 分钟
18.4k
限流器是服务中非常重要的一个组件,在网关设计、微服务、以及普通的后台应用中都比较常见。它可以限制访问服务的频次和速率,防止服务过载,被刷爆。

golang 熔断器的实现

2020-06-28
阅读 4 分钟
4.8k
熔断器像是一个保险丝。当我们依赖的服务出现问题时,可以及时容错。一方面可以减少依赖服务对自身访问的依赖,防止出现雪崩效应;另一方面降低请求频率以方便上游尽快恢复服务。

Go Web 框架 Gin 路由的学习

2020-06-28
阅读 4 分钟
3.6k
Gin 是目前应用比较广泛的Golang web 框架。 目前,Github Star 数已经达到了3.8w. 框架的实现非常简单,可定制性非常强,性能也比较好,深受golang开发者的喜爱。Gin 提供了web开发的一些基本功能。如路由,中间件,日志,参数获取等,本文主要从源码的角度分析Gin的路由实现。

Golang net/rpc 包学习

2020-06-28
阅读 6 分钟
2.4k
远程过程调用 (Remote Procedure Call,RPC) 是一种计算机通信协议。允许运行再一台计算机的程序调用另一个地址空间的子程序(一般是开放网络种的一台计算机),而程序员就像调用调用本地程序一样,无需额外的做交互编程。RPC 是一种 CS (Client-Server) 架构的模式,通过发送请求-接收响应的方式进行信息的交互。

Golang Http 学习(二) Http Client 的实现

2020-06-28
阅读 3 分钟
7k
众所周知,在golang 中实现的 http client 是自带连接池的。当我们做 http 请求时,极有可能就是复用了之前建立的 tcp 连接。那这个连接池是如何实现的,今天我们一起来探究。

Golang Http 学习(一) Http Server 的实现

2020-05-14
阅读 5 分钟
5.4k
Http 服务是基于 Tcp 的应用层的实现,也是我们常见的网络协议之一。go 语言提供了较为丰富的http协议的实现包 net/http 包。http 是典型的C/S 架构(也是B/S架构),我们先从Server端入手,看看Http Server 是如何实现的。

Golang net 包学习和实战

2020-05-08
阅读 4 分钟
10.5k
模型图中可以看到,OSI 的七层模型,每一层实现的是与对端相应层的通信接口。但是实际应用中,我们把会话层、表示层、应用层统称为应用层。因此,就变成了TCP/IP 的五层模型。 其中网络层包含了 ip,arp,icmp 等协议,传输层包含了 TCP, UDP 等协议,应用层,比如 SMTP,DNS,HTTP 等协议。在 net 包中,主要涉及网络层...

golang 容器的学习与实践

2020-05-06
阅读 4 分钟
1.7k
heap 是一个堆的实现。一个堆正常保证了获取/弹出最大(最小)元素的时间为log n、插入元素的时间为log n.golang的堆实现接口如下:

Golang Context 原理与实战

2020-05-03
阅读 9 分钟
8.1k
golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Golang 1.7的版本中正式被引入标准库。下面开始学习。

Golang Map 实现 (四) map的赋值和扩容

2020-04-30
阅读 9 分钟
3.7k
golang map 操作,是map 实现中较复杂的逻辑。因为当赋值时,为了减少hash 冲突链的长度过长问题,会做map 的扩容以及数据的迁移。而map 的扩容以及数据的迁移也是关注的重点。

Golang Map 实现(三)map 的数据访问

2020-04-30
阅读 4 分钟
2.6k
第一种方式不判断是否存在key值,直接返回val (可能是空值)第二种方式会返回一个bool 值,判断是否存在key 键值。(是不是和redis 的空值判断很类似)

Golang Map 实现 (二) map 的创建

2020-04-30
阅读 5 分钟
4.2k
本文在golang map 数据结构的基础上,学习一个make 是如何构造的。 map 创建示例 在golang 中,初始化一个map 算是有两种方式。 {代码...} 第一种方式默认不指定map的容量,第二种会指定后续map的容量估计为100,希望在创建的时候把空间就分配好。 当make创建map时,底层做了什么 对于不同的初始化方式,会使用不同的方...

Golang Map实现(一)

2020-04-26
阅读 3 分钟
2.3k
从大学的课本里面,我们学到:hash 表其实就是将key 通过hash算法映射到数组的某个位置,然后把对应的val存放起来。如果出现了hash冲突(也就是说,不同的key被映射到了相同的位置上时),就需要解决hash冲突。解决hash冲突的方法还是比较多的,比如说开放定址法,再哈希法,链地址法,公共溢出区等(复习下大学的基本知识)。

golang trace 的一个例子

2020-04-17
阅读 3 分钟
2k
代码中,添加了Task 和 Task 的Region,是我们更好的发现我们协程的位置(当然,我这里都捕获了,只是用Region 做了标识),并将记录的 trace 数据写入trace.dat 文件中。

Golang 性能测试 (3) 协程追踪术

2020-04-17
阅读 4 分钟
2k
本文简单介绍 golang 如何做跟踪刨析。 简介 对于绝大部分服务,跟踪刨析是用不到的。但是如果遇到了下面问题,可以不妨一试: 怀疑哪个协程慢了 系统调用有问题 协程调度问题 (chan 交互、互斥锁、信号量等) 怀疑是 gc (Garbage-Collect) 影响了服务性能 网络阻塞 等等 坦白的讲,通过跟踪刨析可以看到每个协程在某一时...

Golang 性能测试 (2) 性能分析

2020-04-17
阅读 5 分钟
2.5k
Golang 语言也为我们提供了方便的性能分析工具pprof,方便我们做必要的服务优化。pprof 可以做cpu分析,统计所有调用方法执行的时间片(通过采样); 可以查看内存分配,找到是否有内存泄漏,哪里泄露了(调用栈);还可以查看Block、事件调用,互斥锁等。可谓麻雀虽小,五脏俱全。Golang 提供了两种分析的工具,一种是web...

golang 性能测试 (1)

2020-04-17
阅读 3 分钟
2.2k
本文介绍golang 如何做基准性能测试。 编写完代码除了跑必要的单元测试外,还需要考虑代码跑起来的性能如何。性能的衡量其实就是程序运行时候进程的内存分配,CPU消耗情况。 golang 语言在提供了功能测试的基础上,提供了丰富的性能测试功能。 SHOW CODE 首先,从一个例子来讲起。 随便写一个简单的快速排序,然后和系统...

你不知道的空格

2020-04-13
阅读 3 分钟
6.2k
历史最悠久的空格,在1967年,ASCII 规范中被定义。空格在 ASCII 中编码为0x20, 占位符为一个半角字符。在日常英文书写和代码编写中使用。

Supervisor 的使用和进阶 (4) - supervisor Event 的使用

2020-04-08
阅读 4 分钟
4.8k
supervisor 作为一个进程管理工具,在 3.0 版本之后,新增了 Event 的高级特性, 主要用于做(进程启动、退出、失败等)事件告警服务。

supervisor 的使用和进阶 (fastcgi 的管理)

2020-04-06
阅读 3 分钟
3.6k
在php 中,php-fpm 有主进程来管理和维护子进程的数量。但是并不是所有的服务都有类似的主进程来做子进程的维护。在很多其他语言中,有很多比较有名的fastcgi 服务,例如py 的flup, c++ 实现的 FastCgi++等。如果这些服务在单机中启动多个进程(极有可能),那如何管理这些进程是个比较头疼的问题。 supervisor 的fastc...

NSQ 落地磁盘的消息队列源码解读

2019-09-11
阅读 7 分钟
5.3k
NSQ 消息队列实现消息落地使用的是 FIFO 队列。实现为 diskqueue , 使用包 github.com/nsqio/go-diskqueue ,本文主要对 diskqueue的实现做介绍。本文代码来自于 github.com/nsqio/go-diskqueue

S3 的一个命令行客户端

2019-08-08
阅读 2 分钟
2.5k
使用Golang 实现了一个S3的简易客户端。 目前实现如下功能: 文件的上传 文件的下载 文件的删除 文件大小,更新时间查看 目前已发布1.0.0, 支持Windows和Linux,其他平台自行编译即可。 session config {代码...} {代码...} upload {代码...} download {代码...} delete {代码...} list {代码...} Github 地址: https:...

golang json 编码 map 与struct 结构的对比

2019-07-05
阅读 4 分钟
4.9k
其中,str 为生成好的固定json数据, 我们对相同的数据做json 编码, 运行结果可以看出,时间差距大约为1倍,若将map的key 个数调整为100个

php 的自增运算符

2019-06-27
阅读 3 分钟
2.4k
php 的一些小众的用法,很多php老司机,使用时也会出问题。 今天就聊一聊php的自增运算符。 bool 值 对于bool值无效。 {代码...} null 值 null 值,自增后为整型1. {代码...} 数字运算 正常范围的整数: {代码...} 最大值的整数,整数直接变成浮点数: {代码...} 浮点数的计算: 若在精度范围内,则自增加1,若不在精度范围...