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

local cache 需要在集群的服务器之间做同步吗?怎么做?

  •  
  •   ben548 · 2023-06-05 20:19:57 +08:00 · 1768 次点击
    这是一个创建于 538 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问个问题,用 golang 的 local cache 库(如 groupcache 、bigcache 等)的时候,有两种方案:
    1 、local cache 通过某种机制同步到集群的每台机器上;(不太确定要怎么实现,我看开源的都没有提供相应的能力,个人感觉如果有这种需求直接用 redis 就好了)
    2 、不管这个,每台服务器维护自己的 cache;(不知道这种方案是不是有什么坑)

    有线上环境用过 local cache 的大佬吗?能一起讨论一下这个问题吗?
    11 条回复    2023-09-09 08:23:49 +08:00
    matrix1010
        1
    matrix1010  
       2023-06-05 20:40:26 +08:00   ❤️ 1
    要看需求怎么样,比如有没有 redis ,如果已经有 redis 可以考虑带有 client side caching 的[rueidis]( https://github.com/redis/rueidis). 如果不想用 redis 而且实时同步要求不高的话可以考虑用普通的 local cache 设个比较短的 ttl ,比如 1 分钟。但这样会有 1 分钟的数据不一致。或者说你的数据量太大,而且没有特别热点的数据,由于本地缓存容量有限因此命中率会极低,只能上 redis 或者类似的远程 kv 。如果你考虑使用 local cache ,欢迎试用我的[Theine]( https://github.com/Yiling-J/theine-go)
    Red998
        2
    Red998  
       2023-06-05 21:20:14 +08:00
    本地缓存性能来说应该是 redis 高的、缺点就是多节点就必须多份缓存。缓存一致性问题
    比如 guava cache 过期就异步 load 也可以。具体看怎么用吧。我觉得读多写少、数据不大用本地缓存还不是不错的。
    否则要么就 redis 吧 省事。
    picone
        3
    picone  
       2023-06-05 21:40:32 +08:00   ❤️ 1
    你都用 local cache 了,怎么还考虑分布式的问题。如果真的想比较强命中,上游可以做一个哈希获取下游地址的策略,通过 cache key 大概率会走到同一台机器。这个问题是对 k8s 比较不友好
    ben548
        4
    ben548  
    OP
       2023-06-05 22:22:31 +08:00 via Android
    我自己想了一下,其实可以先存 redis 里面,然后监听 redis 的变更,订阅变更事件,同步更新 local cache 的数据,查询优先查 local ,查不到就查 redis ,并且查完存 local ,这样应该就是一个多级缓存的概念了,这个其实也是我想要的效果
    matrix1010
        5
    matrix1010  
       2023-06-05 22:41:37 +08:00
    @ben548 你说的其实就是 rueidis 做的事情。但是如果你准备自己开发的话,我建议可以同时存到 redis 和本地而不是下一次 redis 读出来再存。大部分 memory cache 都能限制最大数量所以没什么问题。
    sujin190
        6
    sujin190  
       2023-06-05 23:15:04 +08:00 via Android
    @ben548 太脆弱,如何保证肯定不出错是个问题,有个变更事件没接到或者挂了想再一致太难,缓存的作用是在超大量的时候提高大部分效率,而不是在小流量下加速所有请求,这种没意义,本地缓存的真正价值是读取延时纳秒级,就算过期时间 10 毫秒,假如每秒 10000 次调用,其加速也是巨大的,如果每秒 10 次调用,你再怎么搞也毫无意义,redis 延时毫秒级,数据库几十毫秒,你本地缓存搞个分布式不是把纳秒级延时生生搞到毫秒级了么,这完完全全是负优化,别钻牛角尖啊
    sujin190
        7
    sujin190  
       2023-06-05 23:25:42 +08:00 via Android
    @ben548 本地缓存要么是很长时间不变的,比如各种 secret ,或者集群状态缓存之类不断上报的,要么是读取频率超高,比如数十毫秒过期还能有 10 比 1 命中率的,否则没啥用的价值,redis 缓存怎么也得有 4 比 1 的命中率才有用的价值吧,否则一味搞缓存真的是负优化,纯粹就是给自己找麻烦
    layxy
        8
    layxy  
       2023-06-06 09:35:34 +08:00
    本地缓存不需要做强一致性,也没办法做到强一致性,一般存到本地缓存的数据,对一致性的要求不能太高,要允许一段时间的数据更新信号和处理的时间差
    lasuar
        9
    lasuar  
       2023-06-06 12:17:13 +08:00
    参考楼上,你这脑回路就不太对。要是那么好做人人都能写一个分布式缓存
    securityCoding
        10
    securityCoding  
       2023-06-11 13:36:51 +08:00 via Android
    本地缓存搞啥分布式,分布式那不就是 redis 吗?
    xabcstack
        11
    xabcstack  
       2023-09-09 08:23:49 +08:00
    使用 redis 的消息订阅,一旦某个实例要同步,发送消息广播, 各个实例收到消息, 更新本地 cache , 达到服务器之间同步的需求
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2585 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:31 · PVG 08:31 · LAX 16:31 · JFK 19:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.