首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
V2EX  ›  Go

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

  •  
  •   seaguest · 77 天前 · 2861 次点击
    这是一个创建于 77 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    欢迎大家批评指正!

    17 回复  |  直到 2019-09-05 08:12:51 +08:00
        1
    gowk   77 天前 via Android
    Gopher, Follow 了~
        2
    kevin1234   77 天前
    多机内存中的数据也会同步?
        3
    seaguest   77 天前
    @kevin1234
    这个不会,所有机器共享 redis,各自维护自己的内存缓存。
    通过 Delete 可以删除所有机器中指定 key 的缓存,可以保障下次该 key 被访问时是最新的数据。
        4
    MarkOrca   77 天前
    高并发情况下 subscribe 可以保证数据一致么?
        5
    wweir   77 天前
    正在考虑,直接集成 dragonboat,废了 redis,以实现写少读多场景下的高性能缓存,并真正解决缓存层的强一致问题。
        6
    jziwenchen   77 天前
    学习下
        7
    seaguest   77 天前
    @MarkOrca
    这个之前测过 1000 并发的,主要是读。如果写不是很频繁的话,理论上应该没什么问题。
        8
    seaguest   77 天前
    @wweir

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

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

    这个只是我之前的测试数据,可以更高。
    性能的瓶颈在于请求 DB 的相关逻辑以及 redis 的处理能力,如果 DB 查询没什么问题,redis 单机 10 万 QPS 应该都不是问题。
        16
    MarksGui   69 天前
    不错,学习下
        17
    T3RRY   68 天前
    +1
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2933 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 11:26 · PVG 19:26 · LAX 03:26 · JFK 06:26
    ♥ Do have faith in what you're doing.