开源一下自己的 Go 分布式缓存方案

2019-08-27 17:32:48 +08:00
 seaguest

最近整理了一下自己的分布式缓存方案,主要是内存+redis 二级缓存,支持多机同步,目前已经在线上投入使用,经过百万日活的验证。

内存部分是采用的是 sync.Map, 读取缓存的时候先从内存读,如果未读到则去读 redis,如果 redis 未读到,则根据定义的加载函数加载到 redis 和内存。

缓存有 lazy 模式,为了避免缓存被击穿,可以设置 lazy 模式,缓存数据存活的时间更久,但是每次读取的时候依然会判断数据是否是最新的,不是最新的话会异步加载更新。

通过 redis 的 Publish/Subscribe 功能,实现缓存的分布式更新,目前仅实现删除同步。

项目地址 https://github.com/seaguest/cache

欢迎大家批评指正!

6297 次点击
所在节点    Go 编程语言
17 条回复
gowk
2019-08-27 17:40:07 +08:00
Gopher, Follow 了~
kevin1234
2019-08-27 17:53:47 +08:00
多机内存中的数据也会同步?
seaguest
2019-08-27 17:57:07 +08:00
@kevin1234
这个不会,所有机器共享 redis,各自维护自己的内存缓存。
通过 Delete 可以删除所有机器中指定 key 的缓存,可以保障下次该 key 被访问时是最新的数据。
MarkOrca
2019-08-27 18:12:26 +08:00
高并发情况下 subscribe 可以保证数据一致么?
wweir
2019-08-27 18:23:23 +08:00
正在考虑,直接集成 dragonboat,废了 redis,以实现写少读多场景下的高性能缓存,并真正解决缓存层的强一致问题。
jziwenchen
2019-08-27 18:56:32 +08:00
学习下
seaguest
2019-08-27 19:22:53 +08:00
@MarkOrca
这个之前测过 1000 并发的,主要是读。如果写不是很频繁的话,理论上应该没什么问题。
seaguest
2019-08-27 19:24:46 +08:00
@wweir

我这个是轻量级的缓存,主要是以读为主。
更新的话,目前是直接写数据库,然后删除对应的缓存,下次访问缓存未命中直接查询数据库就可得到最新的数据。
blless
2019-08-27 19:30:04 +08:00
我好像也写过一个来着,本机加了一个超时控制,redis 做业务锁控制读写,所以并发还是受限于 redis
swulling
2019-08-27 19:33:58 +08:00
可以试试 Redis 新版本的客户端缓存,就不用业务自己写缓存
iPhoneXI
2019-08-27 19:37:30 +08:00
@seaguest #8 缓存更新是不是用 Cache Aside Pattern 更好
https://coolshell.cn/articles/17416.html
seaguest
2019-08-27 19:43:10 +08:00
@iPhoneXI

是的,目前采取的就是这个策略,只不过加了内存->redis 两层。
更新目前直接操作数据库,然后调用 Delete 使其失效。
HackerZ
2019-08-28 09:15:40 +08:00
我也做了一套类似的解决方案,使用 checksum 解决了多节点内存数据不一致的问题~
chennqqi
2019-08-28 10:04:10 +08:00
1000 并发是不是少了一点。。。
seaguest
2019-08-28 10:13:56 +08:00
@chennqqi

这个只是我之前的测试数据,可以更高。
性能的瓶颈在于请求 DB 的相关逻辑以及 redis 的处理能力,如果 DB 查询没什么问题,redis 单机 10 万 QPS 应该都不是问题。
MarksGui
2019-09-04 11:50:14 +08:00
不错,学习下
T3RRY
2019-09-05 08:12:51 +08:00
+1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/595606

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX