Lumberjack源码剖析

介绍 lumberjack就是一个用来管理日志文件的利器,经常与各种日志组件配合起来使用,实现日志的老化压缩,文件分割等等功能。 清理旧的日志文

GRPC的错误处理实践

背景 我们内部系统全部统一采用gRPC协议和protobuf编解码。统一的好处在于不需要在做任何协议、编解码转换,这样就可以使我们所有业务采用

系统设计的框架

前言 系统设计面试中,经常会被问到如何设计微信、如何设计微博、如何设计百度……我们怎么能在如此短的时间内设计出来一个由成千上万的码农、PM,经

系统设计中如何进行估算

前言 在日常工作中,经常会遇到一些大促场景,需要评估系统的资源是否充足,是否需要增加资源,增加多少。 想要做到“准确”的估算,需要对数字有一定的

Go的内存对齐

何为内存对齐 现代计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况

Go中优化字符串比较操作

测量大小写敏感的比较 首先,我们来测量下两种字符串比较 第一种:使用比较操作符 1 2 3 4 5 if a == b { return true }else { return false } 第二种:使用 Strings.Compare 1 2 3 4 if strings.Compare(a, b) == 0

Go的Finalizer源码剖析

SetFinalizer runtime.SetFinalizer: 1 func SetFinalizer(obj interface{}, finalizer interface{}) 对象可以关联一个SetFinalizer函数, 当gc检测到unreachable对象有关联的SetFinalizer函数时,

Go如何优化GC触发频率

观察GC 我们以下面的程序为例,先使用四种不同的方式来介绍如何观察 GC,并在后面的问题中通过几个详细的例子再来讨论如何优化 GC。 1 2 3 4 5 6 7

MySQL如何优化深分页

前文 在你开发程序的时候,使用 LIMIT 子句做分页查询可能是非常频繁的,这是一个非常常见的业务场景。 那你在使用 limit 子句的时候有没有遇到过什么问题呢,比如

MySQL分库分表方案设计

为什么分库分表 并非所有表都需要水平拆分,要看增长的类型和速度,水平拆分是大招,拆分后会增加开发的复杂度,不到万不得已不使用。 分库分表之前的一

如何使用Redis缓存分页查询

常规分页查询缓存方案 我们都知道,通过缓存查询的结果,可以极大的提升系统的服务能力,以及降低底层服务或者是数据库的压力。 对于有分页条件的缓存,

评论系统方案设计

评论系统架构设计 功能模块 架构设计最重要的就是理解整个产品体系在系统中的定位。搞清楚系统背后的背景,才能做出最佳的设计和抽象。不要做需求的翻译

关系链方案设计

好友关系 粉丝与关注,社交好友,都是典型的“多对多关系”的业务,这类业务的核心服务是好友中心,当关系链达到百亿之后,好友中心架构设计要考虑哪些

红包方案设计

社交红包 设计目标 一般来说,抢红包场景下,至少要考虑下面几点—— 高性能:主要是为了保证用户体验,即用户能尽快看到结果,尽快把抢到金额加到账户。

排行榜方案设计

业务分类 排行榜业务变化多样,从不同的角度思考,是不同的排行榜需求,但总结起来,主要分为以下几类: 实效性 从排行榜的实效性上划分,主要分为: 实时

Go实现十进制转换任意进制

记录一下10进制和62进制相互转换的方法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 var chars string = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" func encode(num int64) string { bytes := []byte{} for num > 0 { bytes = append(bytes, chars[num%62])

短链接方案设计

短链优点 那么为啥要用短链表示,直接用长链不行吗,用短链的话有如下好外 1、链接变短,在对内容长度有限制的平台发文,可编辑的文字就变多了 最典型的

MySQL为什么选择B+树

介绍 B+树只有叶节点存放数据,其余节点用来索引,而B树是每个索引节点都会有Data域。所以从Mysql(Inoodb)的角度来看,B+树是用

Redis的zset为什么选择跳表

跳表与红黑树 范围查找 在做范围查找的时候,平衡树比skiplist操作要复杂。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继