dCache 是一个基于 Go 开发的分布式缓存系统
, 是一个开箱即用的 server 组件
使用 Go
+ gRPC
+ etcd
+ singleFlight
- 使用 LRU-K 进行缓存淘汰
- 使用 一致性哈希 进行节点选择
- 使用 singleFlight 防止缓存雪崩与缓存击穿
- 使用 gRPC 实现节点间通信
- 使用 Protobuf 作为序列化方式
- 使用 etcd 进行服务发现
- 构建
make run
- 测试
- 测试前确保本地已启动 etcd 服务
docker run --name etcd -p 2379:2379 -e ALLOW_NONE_AUTHENTICATION=yes -d binami/etcd:latest
make test
- 使用:
借助 Go Modules 然后:
import "github.com/peanutzhen/peanutcache"
- dCache 通过封装
Group
对外提供服务- 提供两个接口
- Get: 从缓存中获取值
- Update:先删除数据库,再删除缓存,保证缓存与数据库之间的一致性
- Group 也是命名空间, 不同的命名空间之间是相互隔离的
- 提供两个接口
- 测试代码见example
- 测试环境:
- CPU: Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz
- GPU: NVIDIA GeForce GTX 1660Ti
- 内存: 8G+8G
- 内核版本: 6.5.9-arch2-1
- 在缓存均命中的情况下,
go test -bench=".*"
的结果如下:
719850 1545 ns/op
PASS
ok github.com/Daz-3ux/dazCache/example/benchMark 1.135s
- 缓存均命中情况下: perf 测试结果如下
- 使用
make perf
进行测试
- 使用
Performance counter stats for '/home/realdaz/z-project/dCache/example/perf/perfTest':
283.35 msec task-clock:u # 1.026 CPUs utilized
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
1,518 page-faults:u # 5.357 K/sec
348,824,662 cycles:u # 1.231 GHz
538,245,341 instructions:u # 1.54 insn per cycle
106,920,921 branches:u # 377.352 M/sec
1,020,084 branch-misses:u # 0.95% of all branches
0.276101514 seconds time elapsed
0.069122000 seconds user
0.213862000 seconds sys
是
接收 key --> 检查是否被缓存 -----> 返回缓存值 ⑴
| 否 是
|-----> 是否应当从远程节点获取 -----> 与远程节点交互 --> 返回缓存值 ⑵
| 否
|-----> 调用`回调函数`,获取值并添加到缓存 --> 返回缓存值 ⑶