分布式缓存原理及Go实现 - 第二章
第二章:基于TCP的内存缓存服务
前面的第1章实现了基于HTTP/REST的内存内缓存服务,利用了Go语言本身的HTTP框架,其性能不如Redis。本章要实现基于TCP的缓存服务来提升性能。
2.1 基于TCP的缓存协议规范
2.1.1 协议规范
此外curl命令只适用于HTTP客户端,我们需要一个能直接使用的TCP的客户端,本章自己实现了一个。
对于TCP来说,客户端和服务端之间传输的是网络字节流,它不区分方法及URL,头部和正文这些格式化的文本。
TCP的ABDF表达:SP表示空格,DIGIT表示0~9;OCTET表示八位数据,也就是一个字节,更多ABDF表达规范参考:
网络协议-HTTP 协议(DNS解析和ABNF描述)_爱因诗贤的博客-CSDN博客
2.1.2 缓存Set流程
- 客户端发出command字节流:
S<klen><SP><vlen><SP><key><value>
- 服务端解析command并提取出 key 和 value,然后调用inMemoryCache.Set将键值对保存在内存的map中。
- 如果cache.Cache.Set方法成功,就将tcp.Server向客户端连接写入”0”.
2.1.3 缓存Get流程
- 客户端发出command字节流:
G<klen><SP><key>
- 服务端解析command并提取出 key,然后调用inMemoryCache.Get方法查询key对应的value。
- 如果cache.Cache.Get方法错误,tcp.Server就向客户端写入一个error.
2.1.4 缓存Del流程
- 客户端发出command字节流:
D<klen><SP><key>
- 服务端解析command并提取出 key,然后调用inMemoryCache.Del方法删除key对应的value。
- 如果cache.Cache.Get方法错误,tcp.Server就向客户端写入一个error.
2.2 Go语言实现
2.2.1 main函数
1 | package main |
2.2.2 TCP包的实现
Server结构体的实现
1 | package tcp |
Server.process方法的相关实现
1 | //readkey.go |
2.2.3 客户端的实现
1 | package main |
编译和运行客户端的命令:
1 | go build |
1 | #得到如下的结果 |
本书后续用到的TCP客户端都在此运行。
编译并运行chapter2中的server之后就可以在客户端进行测试了。
1 | ./client -c set -k testkey -v testvalue #上传一个键值对 |
服务端的状态如下:
1 | StatusCode : 200 |
1 | ./cache-benchmark -type tcp -n 100000 -r 100000 -t set |
检测性能发现使用TCP的缓存确实可以提升一定的性能。