Golang的interface探究
golang被诟病最多的,没有泛型应该算一个。作为强类型语言来说,没有泛型很多时候在业务开发上会有些不适应,但是它有个interface类型,被很多人拿来当泛型玩,如果你了解它的原理也是没问题的。但是你真的了解吗? Interfacegolang 中的interface,可以将任意类型的变量赋予它。常见的我们区分两种,一种就是struct类型的,因为struct可能会有func;另外一种,就...
Redis5.0 RDB文件超详细解析
Redis RDB介绍RDB 是 Redis 将 server 端的内存中的 k/v 对以二进制的方式,持久化存储的一种文件形式。文件中,一般会以 对象的长度+对象 的格式来存储,只要根据这个格式,就能渐进的遍历整个文件。Redis 还支持开启 LZF 的压缩算法,可以牺牲CPU时间,来减少 RDB 文件的大小;如果开启LZF并且超过20个bytes时,会将压缩后的字符写入文件。 RDB文件...
从底层理解 Golang 的 map 实现
定义golang 中的 map 就是常用的 hashtable,底层实现由 hmap,维护着若干个 bucket 数组,通常每个 bucket 保存着8组kv对,如果超过8个(发生hash冲突时),会在 extra 字段结构体中的 overflow ,使用链地址法一直扩展下去。先看下 hmap 结构体: type hmap struct { count int // 元素的个...
详解 Golang 的 slice 设计与实现
Slice 结构体slice 是 golang 中利用指针指向某个连续片段的数组,所以本质上它算是引用类型。一个 slice 在 golang 中占用24个 bytes a = make([]int, 0) unsafe.Sizeof(a) // 24 var c int unsafe.Sizeof(c) // 8, 一个 int 在 golang 中占用 8 个bytes(本...
分布式事务原理
事务的必要性一般提到事务,首先想到的就是 MySQL 的 transaction,但是很多场景,仅仅依靠 MySQL, 还是无法保证业务场景需要的 ACID。以购物场景为例,张三购买物品,账户扣款 100 元的同时,需要保证在下游的会员服务中给该账户增加 100 积分。而扣款的业务和增加积分的业务是在两个不同的应用,正常处理逻辑一般是先扣除100元,然后网络通知积分服务增加100积分。类似这...
从 Ethernet 到 tcp 包分析
以太网帧格式 “ 以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是目前应用最普遍的局域网技术,取代了其他局域网技术如令牌环、FDDI和ARCNET。” – Wiki百科 从 Xerox 公布的 Ethernet I 发展到现在,有过6种以太帧格式: Ethernet I E...
epoll究竟快在哪
为什么 epoll 这么快epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,在开始讨论这个问题之前,先来解释一下为什么需要多路复用IO. 以一个生活中的例子来解释. 假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.如果你使用的阻塞IO模型来处理这个问题...
对比IO和IO多路复用模型
IO 模式 和 IO 多路复用用户空间和内核空间  现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内存的地址),再通过总线的传递,最后处理器拿到某个物理地址返回的字节。   对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有...
Redis-字典
Redis 还有一种比较常用的数据类型,字典。C 语言没有这种数据结构,但是 在JAVA 语言中的 map,和 PHP 语言里的 关联数组,就是这种类型,它用来保存 key => value 的键值对,要求键必须是唯一,在字段中,已知一个 key,对这个的 key 对应 value 做 CRUD操作,都非常方便。 Redis 自己实现了这个结构,并且用它来作 哈希键的底层实现之一,如果...
聊聊504、502和499的故事
每次工作中碰到 5xx 的 http 状态码,都会比较头疼,又要排查了,每次都是从 nginx 的 error_log 追溯,一直到 php_error_log,确定大概位置,翻代码… 恰巧碰到最近组内在学习 nginx 源码,打算深入研究一下,如果有可能让偶发事件成可控事件,那一定能明白其中的原因,更快定位问题,对日后工作排查,应该会有帮助。 Gateway Time-out 504错误是...