- 博客(20)
- 资源 (2)
- 收藏
- 关注
原创 Golang Sync.WaitGroup 使用及原理
Golang Sync.WaitGroup 使用及原理使用func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println("Hello WaitGroup!") }() } wg.Wait()}实现首先看 waitgroup 到底是什么数据结构type WaitGroup struct { noC
2022-02-22 15:14:15
494
原创 Gin 如何动态生成模型 swagger 文档
在做 API 接口开发时, 一般会统一 API 返回格式, 例如{ "code": 200, "data": { //xxxxx //xxxxx }, "message": "OK"}在后端代码定义中, 也会定义一个结构体来对应这种结构, 并且, 由于 data 字段里的数据是未知的(与具体业务相关), 所以会定义一个 interface 来接收type ApiResponse struct { Code int `
2021-12-01 20:33:40
385
原创 第六章数据分区
数据分区(数据密集型应用系统设计第六章)我们必须摆脱串行的限制. 明确状态定义, 提供优先级与属性描述, 我们必须首先定义清楚关系, 然后才是执行步骤 ------Grace Murray Hopper, 管理方法以及未来的计算机面对海量数据或非常高的压力查询, 复制技术还不够, 我们还需要将数据拆分成为分区或分片分区的定义: 每一条数据(或者每条记录, 每行或每个文档) 只属于某个特定分区采用数据分区的目的是提高可扩展性, 不同的分区可以放在一个无共享集群的不同节点上, 对 单个分区进
2021-10-29 16:34:50
273
原创 第五章数据复制
数据复制(数据密集型应用系统设计第五章)一个可能出错的事物与一个不可能出错的事物之间的主要区别是, 当一个不可能出错的事物出错了, 通常也就意味着不可修复. -----Douglas Adams, <<基本无害>> (1992)为什么需要复制:使数据在地理位置上更接近用户, 从而降低访问延迟当部分组件出现故障, 系统依然可以继续工作, 从而提高可用性扩展至多台机器以同时提供数据访问服务, 从而提高吞吐量主节点和从节点引入多副本后, 如何保证所有副本之间
2021-10-29 16:33:55
145
原创 [笔记]数据存储与检索
数据存储与检索(数据密集型应用系统设计)如果你把东西整理得井井有条, 下次就不用查找了 — 德国谚语从最基本的层面看, 数据库只需要做两件事情向它插入数据时, 它就保存数据查询数据时, 它应该返回需要的数据数据库核心: 数据结构世界上最简单的数据库#!/bin/bashdb_set() { echo "$1,$2" >> database}db_get() { grep "^$1," database | sed -e "s
2021-10-27 16:27:57
342
原创 MySQL的为什么
ReferenceMySQL实战45讲为什么 MySQL 偶尔会选错索引原因: 选择索引是优化器的工作, 优化器会结合预计扫描行数, 是否使用临时表, 是否排序因素进行综合判断解决: 扫描行数不准确可以使用 analyze table 解决, 可以使用 force index 强制使用指定索引, 或者修改 SQL 语句, 或者删除影响优化器判断的索引.怎么给字符串加索引字符串相比 int, 索引占用空间巨大, 影响 io 性能, 可以使用前缀索引, 比如字段 name 保存了 abc111, a
2021-08-04 20:59:48
88
原创 MySQL 索引原理
为什么数据库需要索引数据库的作用一般是存放应用程序不可丢失的数据, 由于内存的价格和易失性, 所以不能存放长久的数据, 所以需要持久化到硬盘, 但是硬盘的读取速度相较于内存来说相差一个数量级, 所以为了加快硬盘的读写速度, 索引就出现了, 它就像书本的目录一样, 能够快速定位到你想看的地方.索引的几种实现前面解释到: 索引本质上就是为了提高查询效率.那么使用什么样的数据结构存储索引呢?哈希表?哈希表有着 O(1) 的读写性能, 美中不足的是存在哈希碰撞, 但是有拉链法的存在, 可以稍微解决
2021-08-04 00:04:00
69
翻译 【译】Go:逃逸分析介绍
本文基于 Go 1.13逃逸分析是 Go 编译器的一部分。它分析源代码并确定哪些变量应该分配到栈上、哪些逃逸到堆上。静态分析Go 在编译阶段就定义了什么应该在堆,什么应该在栈上。在 go run 或 go build 时加上 -gcflags="-m" 就可以得到分析结果。这里有个简单的例子:func main() { num := getRandom() println(*num)}//go:noinlinefunc getRandom() *int { tmp := rand.
2021-07-20 16:52:55
147
原创 wireshark 调试 https/http2和grpc流量
本文浏览器以 Chrom 为例平常需要抓包的场景比较少,记录一下防止下次忘记配置1. 解析 TLS在本地创建用于保存 ssl logfile 的文件(文件可以存放到任意位置), 并添加到环境变量中touch ~/tls/sslkeylog.logecho "export SSLKEYLOGFILE=~/tls/sslkeylog.log" >> ~/.zshrcsource ~/.zshrc接下来在 wireshark 中配置 ssl log接着通过终端启动 chrom.
2021-07-14 22:42:04
388
原创 深入理解 Go Map
文章参考:Go语言设计与实现3.3 哈希表哈希表的意义不言而喻,它能提供 O(1) 复杂度的读写性能,所以主流编程语言中都内置有哈希表。哈希表的关键在于哈希函数, 好的哈希函数能减少哈希碰撞,提供最优秀的读写性能。哈希碰撞因为没有完美的哈希函数, 所以哈希碰撞不可避免,一般有开放寻址法和拉链法,其中拉链法是主流开放寻址法:当向哈希表写入新的数据时,如果发生了冲突,就会将键值对写入到下一个索引不为空的位置拉链法:拉链法一般使用数组和链表组成,数据经过哈希函数得到一个桶时,先遍历桶中.
2021-07-12 10:55:57
72
原创 Redis过期时间解析
文章参考:《Redis 设计与实现》黄建宏设置过期时间通过 EXPIRE 或者 PEXPIRE 命令,客户端可以以秒或毫秒精度为数据库中的某个键设置生存时间 TTL (Time To Live)SETEX 命令可以设置一个字符串的同时为键设置过期时间保存过期时间redisDb 结构的 expires 字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:过期字典的键是一个指针,这个指针指向键空间中的某个键对象过期字典的值十亿额 long long 类型的整数,保存了键的过期时.
2021-07-09 11:12:16
217
原创 Redis底层数据结构之整数集合
文章参考:《Redis 设计与实现》黄建宏整数集合整数集合时集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合数量不多时,就会使用整数集合typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[];} intset;Contents 数组是整数集合的底层实现;每个项在数组中从小到大有序的排列,并.
2021-07-08 13:57:55
62
原创 Redis底层数据结构之压缩列表
文章参考:《Redis 设计与实现》黄建宏压缩列表压缩列表 ziplist 是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串, 那么Redis 就会使用压缩列表当列表键的底层实现。例如:redis> RPUSH lst 1 3 5 10086 "hello" "world"(integer)6redis> OBJECT ENCODING lst"ziplist"列表键里面包含的都是1、3、5、1008.
2021-07-07 10:34:10
100
原创 Redis底层数据结构之跳跃表
文章参考《Redis 设计与实现》黄建宏Redis(2) 跳跃表跳跃表跳跃表 skiplist 是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的,平均复杂度 O(logN)、最坏 O(N)Redis 使用跳表作为有序集合集合键的底层实现之一,如果一个有序集合包含的元素数量比较多, 或者有序集合中成员是比较长的字符串时,Redis 就会使用跳表来作为有序集合键的底层实现。另一个使用跳表的事集群节点中用作内部数据结构。header 指向跳跃表的表.
2021-07-06 10:01:45
79
原创 Redis 底层数据结构之字典
文章参考 《Redis 设计与实现》黄建宏字典在字典中,每个键都是独一无二的,程序可以在字典中根据键查找与之相关联的值,或者通过键来更新和删除值。字典在 Redis 中的应用相当广泛,比如 Redis 的数据库就是使用字典来作为底层实现的,例如:redis> SET msg "hello world"OK在数据库中创建一个键为 “msg” 值为 “hello world” 的键值对, 这个键值对就保存在数据库的字典里面。哈希键的底层实现之一也是字典哈希表Redis 字典所使用的.
2021-07-05 16:11:12
157
原创 Redis 底层数据结构之链表
文章参考:《Redis设计与实现》黄建宏链表链表提供了高效的节点重排能力,以及可以顺序访问,也可以通过增删节点灵活调整链表长度,Redis中的列表、发布订阅、慢查询、监视器等功能均用到了链表。链表和链表节点的实现链表节点的定义typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value;}listNode;多个 .
2021-07-04 22:58:29
124
1
原创 Redis 底层数据结构之String
文章参考:《Redis设计与实现》黄建宏Redis 的 string 类型底层使用的是 SDS(动态字符串) 实现的, 具体数据结构如下:struct sdshdr { int len; // 记录字符串长度 int free; // 记录 buf 数组中未使用字节的数量 char buf[]; // 保存字符串的字节数组}例如:free = 0 代表这个 SDS 没有空闲空间存放字符len = 5 代表这个 SDS 存放的字符串长度是 5buf 是一个字符数组,保存.
2021-07-03 23:47:30
74
原创 Docker+Vagrant+Gitlab 构建自动化的 CI/CD
如果你的开发流程是下面????这个样子的, 那么你一定很好奇, 为什么我提交到仓库的代码可以自动部署并访问到最新的提交内容这就是近年来兴起的 DevOps 文化, 很方便的解决了开发人员和运维人员每次发布版本需要联调沟通等问题, 缩短了程序发布时间, 可以以更短的周期进行迭代。所以在收集了很多教程之后, 我也搭建了一个可自动测试,测试用例通过后可自动部署的 CI/CD 流程实验前准备VirtualBox 用来模拟需要用到的服务器(大概4台,云服务器也可以)Vagrant 用来编排 Virtua
2021-07-03 22:22:33
236
2
翻译 【译】Go:程序如何恢复?
原文:https://medium.com/a-journey-with-go/go-how-does-a-program-recover-fbbbf27cc31e 当程序不能正确处理错误时, 会触发 Go 的 panic,比如无效的内存访问。如果错误时意外发生的,并且没有别的方法来处理它,开发人员也可以触发 panic。理解恢复或终止的流程有助于理解程序 panic 的后果。多个函数帧关于 panic 和 recover 有很多典型的例子和文档,包括 Go 博客中的 “Defer.
2021-07-02 23:59:15
164
翻译 【译】Go:管理多个错误
原文:https://medium.com/a-journey-with-go/go-multiple-errors-management-a67477628cf1 关于开发者使用Go遇到的最大挑战的年度调查报告中,错误管理是经常被争论和反复提起的话题。然而,当涉及到在并发环境中处理错误或为相同的 goroutine 组合多个错误时,Go 提供了很好的包,使多个错误的管理变得很容易单个 goroutine,多个错误例如,当您处理具有重试策略的代码时,将多个错误合并成一个非常有用。下.
2021-07-01 21:23:06
451
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人