开辟这个专题页,记录下自己看过的一些书。
《Go 语言高级编程》
分章节简介:
- 第 1 章,基础知识,略过;
- 第 2 章,CGO ,中规中矩,建议 C++ 转过来的同学多看看;
- 第 3 章,汇编,很多知识在 CSAPP 里面都有了,但也有一些 Golang 自己的特色,可以略读,实际应用场景应该不多;
- 第 4 章,RPC 和 protobuf,很基础的知识,算不上“高级”;
- 第 5 章,web 开发,也很基础。其中讲到令牌桶的“惰性计算”这个知识点学习了;
- 第 6 章,分布式,这一章就比较水了,基本算是各种库的使用教学,分布式的核心知识涉及较少。当然作为一本 go 教学书籍不可能面面俱到,分布式可以看看 MIT 6.824。
推荐指数:🌟🌟🌟🌟🌟,重点是了解 Golang 开发的一些思路。
ThinkOS
分章节简介:
- 第 1 章,编译型语言和脚本语言的异同;
- 第 2 章,进程,基础知识了;
- 第 3 章,虚拟内存和地址转换,温故而知新;
- 第 4 章,文件系统和数据流,基础知识;
- 第 5 章,数字和字符编码,略过;
- 第 6 章,动态内存管理;
- 第 7 章,缓存和内存和层级结构;
- 第 8 章,多任务和任务优先级,线程进程基础知识;
- 第 9 - 11 章,学习 pthread 基本用法,熟悉 API。
推荐指数:🌟🌟🌟🌟,有讲解有实践,算是 APUE 和 CSAPP 杂糅简略版。
Redis 设计与实现
分章节简介:
- 第 1 章,略;
- 第 2 章,SDS,redis 里面的字符串实现,’\0’ 结尾,可以 O(1) 获取长度和未使用空间;空间预分配,小于 1m 倍增,大于 1m 比实际长度多 1m;二进制安全;
- 第 3 章,链表,无环双向链表,list 结构记录头尾指针和链表长度,
dup
、free
和match
函数分别复制、释放和比较节点; 第 4 章,字典,dict 结构包含长度为 2 的哈希表数组 ht,平时只用 ht[0], rehash 时使用 ht[1];哈希表记录总大小 size 和已有节点数 used,
load_factor = ht[0].used / ht[0].size
;MurmurHash2
计算 hash 值,开链法解决冲突,新插入的值在链表头部;rehash 时 ht[1] 大小向上取 2 的整数次幂(扩容,ht[0].used * 2
;缩容,ht[0].used
),类似双 buffer 的思路。根据是否正在执行BGSAVE
命令或者BGREWRITEAOF
命令,负载因子阈值最大为 1 或 5,因为 BGSAVE 时有子进程,因为 COW 机制,避免在在子进程存在期间扩展,可避免不必要的内存写入操作,最大限度地节约内存;负载因子低于 0.1 开始缩容。为避免 rehash 导致服务性能退化,采用渐进式 rehash
,在 rehash 进行期间,每次对字典执行添加、删除、查找或者更新操作时,程序除了执行指定的操作以外,还会顺带将 ht[0] 哈希表在 rehashidx 索引上的所有键值对 rehash 到 ht[1] ;rehash 时的增删查如何进行:- 增,只写 ht[1] ;
- 删,同时删 ht[0] 和 ht[1] ;
- 查,先查 ht[1] ,找不到再到 ht[1] 查;
这一措施保证了 ht[0] 包含的键值对数量会只减不增, 并随着 rehash 操作的执行而最终变成空表。
- 第 5 章,跳表,相对标准跳表增加了如下功能: O(1) 复杂度取长度和层数,回退指针;层高介于 1-32;
- 第 6 章,整数集合,intset 包含
encoding
,length
,contents
三个字段, encoding 指定 contents 数组的编码位数(16、32、64位),length 是元素个数, contents 是一个柔性数组。插入元素值太大时 contents 数组可以自动升级,升级复杂度 O(n); - 第 7 章,压缩列表,
zlbytes
总字节数,zltail
尾节点偏移量,zllen
元素个数,zlend
尾部标记,固定为0xFF
;ziplistPush 、 ziplistInsert 、 ziplistDelete 和 ziplistDeleteRange 四个函数都有可能会引发连锁更新, 所以它们的最坏复杂度都是 O(N^2) ; - 第 8 章,对象,
字符串
、列表
、哈希
、集合
、有序集合
五种类型的对象, 每种类型的对象至少都有两种或以上的编码方式, 不同的编码可以在不同的使用场景上优化对象的使用效率;对象系统带有引用计数实现的内存回收机制;
第二部分主要讲 AOF 和 RDB ,第三部分主要讲集群,这些知识网上资料太多,略过。
推荐指数:🌟🌟🌟🌟🌟,作者专精 Redis ,写的东西都通俗易懂,值得我们学习。