一致性哈希

原理

一致性哈希算法将整个哈希值空间映射成一个虚拟的圆环,整个哈希空间的取值范围为0-2^32-1。整个空间按顺时针方向组织。0-2^32-1在零点中方向重合。接下来使用如下算法对服务请求进行映射,将服务请求使用哈希算法算出对应的hash值,然后根据hash值的位置沿圆环顺时针查找,第一台遇到的服务器就是所对应的处理请求服务器。

阅读更多

tcpdump观察tcp连接

使用tcpdump抓包

1
2
tcpdump -n -S -i eth0 host www.baidu.com and tcp port 80
curl www.baidu.com

标志位含义

SYN:发起一个新连接
FIN:释放一个连接
ACK:确认序号有效

PSH:接收方应该尽快将这个报文交给应用层
RST:重置连接
URG:紧急指针(urgent pointer)有效

阅读更多

浮点数

float double之类的只存储整数是准确的,浮点数的小数部分实际上是(1 or 0) * 2^(-1) + (1 or 0) * 2^(-2) + (1 or 0) * 2^(-2)...这样实现的
比如
0.3 * 2 = 0.6
0.6 * 2 = 1.2
0.2 * 2 = 0.4
0.4 * 2 = 0.8
0.8 * 2 = 1.6
0.6 * 2 = 1.2
...
这样0.3就永远不能精确的存储

Golang string []byte 高性能转换

前言

有时候经常要在golang用到byte与string的转换,然而在golang中通过string()和[]byte()的转换是需要copy的,通过benchmark就可以看出这样的转换存在一定的开销对gc也是不友好的。

1
2
3
4
5
6
func Benchmark_str2bytesByNormal(b *testing.B) {
    testStr := "test"
    for i := 0; i < b.N; i++ {
         _ = []byte(testStr)
    }
}
1
2
3
4
5
goos: windows
goarch: amd64
pkg: playground
Benchmark_str2bytesByNormal-16        161724543             7.38 ns/op
PASS

可以看到上面的benchmark一个op的耗时为7.38ns

阅读更多