最近整理了一下自己的分布式缓存方案,主要是内存+redis 二级缓存,支持多机同步,目前已经在线上投入使用,经过百万日活的验证。
内存部分是采用的是 sync.Map, 读取缓存的时候先从内存读,如果未读到则去读 redis,如果 redis 未读到,则根据定义的加载函数加载到 redis 和内存。
缓存有 lazy 模式,为了避免缓存被击穿,可以设置 lazy 模式,缓存数据存活的时间更久,但是每次读取的时候依然会判断数据是否是最新的,不是最新的话会异步加载更新。
通过 redis 的 Publish/Subscribe 功能,实现缓存的分布式更新,目前仅实现删除同步。
项目地址 https://github.com/seaguest/cache
欢迎大家批评指正!
1
gowk 2019-08-27 17:40:07 +08:00 via Android
Gopher, Follow 了~
|
2
kevin1234 2019-08-27 17:53:47 +08:00
多机内存中的数据也会同步?
|
3
seaguest OP |
4
MarkOrca 2019-08-27 18:12:26 +08:00
高并发情况下 subscribe 可以保证数据一致么?
|
5
wweir 2019-08-27 18:23:23 +08:00
正在考虑,直接集成 dragonboat,废了 redis,以实现写少读多场景下的高性能缓存,并真正解决缓存层的强一致问题。
|
6
jziwenchen 2019-08-27 18:56:32 +08:00
学习下
|
8
seaguest OP |
9
blless 2019-08-27 19:30:04 +08:00 via Android
我好像也写过一个来着,本机加了一个超时控制,redis 做业务锁控制读写,所以并发还是受限于 redis
|
10
swulling 2019-08-27 19:33:58 +08:00 via iPhone
可以试试 Redis 新版本的客户端缓存,就不用业务自己写缓存
|
11
iPhoneXI 2019-08-27 19:37:30 +08:00
|
12
seaguest OP |
13
HackerZ 2019-08-28 09:15:40 +08:00
我也做了一套类似的解决方案,使用 checksum 解决了多节点内存数据不一致的问题~
|
14
chennqqi 2019-08-28 10:04:10 +08:00
1000 并发是不是少了一点。。。
|
15
seaguest OP @chennqqi
这个只是我之前的测试数据,可以更高。 性能的瓶颈在于请求 DB 的相关逻辑以及 redis 的处理能力,如果 DB 查询没什么问题,redis 单机 10 万 QPS 应该都不是问题。 |
16
MarksGui 2019-09-04 11:50:14 +08:00
不错,学习下
|
17
T3RRY 2019-09-05 08:12:51 +08:00
+1
|