最近整理了一下自己的分布式缓存方案,主要是内存+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 |