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

326 天前
 ben548
问个问题,用 golang 的 local cache 库(如 groupcache 、bigcache 等)的时候,有两种方案:
1 、local cache 通过某种机制同步到集群的每台机器上;(不太确定要怎么实现,我看开源的都没有提供相应的能力,个人感觉如果有这种需求直接用 redis 就好了)
2 、不管这个,每台服务器维护自己的 cache;(不知道这种方案是不是有什么坑)

有线上环境用过 local cache 的大佬吗?能一起讨论一下这个问题吗?
1576 次点击
所在节点    Go 编程语言
11 条回复
matrix1010
326 天前
要看需求怎么样,比如有没有 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
326 天前
本地缓存性能来说应该是 redis 高的、缺点就是多节点就必须多份缓存。缓存一致性问题
比如 guava cache 过期就异步 load 也可以。具体看怎么用吧。我觉得读多写少、数据不大用本地缓存还不是不错的。
否则要么就 redis 吧 省事。
picone
326 天前
你都用 local cache 了,怎么还考虑分布式的问题。如果真的想比较强命中,上游可以做一个哈希获取下游地址的策略,通过 cache key 大概率会走到同一台机器。这个问题是对 k8s 比较不友好
ben548
326 天前
我自己想了一下,其实可以先存 redis 里面,然后监听 redis 的变更,订阅变更事件,同步更新 local cache 的数据,查询优先查 local ,查不到就查 redis ,并且查完存 local ,这样应该就是一个多级缓存的概念了,这个其实也是我想要的效果
matrix1010
326 天前
@ben548 你说的其实就是 rueidis 做的事情。但是如果你准备自己开发的话,我建议可以同时存到 redis 和本地而不是下一次 redis 读出来再存。大部分 memory cache 都能限制最大数量所以没什么问题。
sujin190
326 天前
@ben548 太脆弱,如何保证肯定不出错是个问题,有个变更事件没接到或者挂了想再一致太难,缓存的作用是在超大量的时候提高大部分效率,而不是在小流量下加速所有请求,这种没意义,本地缓存的真正价值是读取延时纳秒级,就算过期时间 10 毫秒,假如每秒 10000 次调用,其加速也是巨大的,如果每秒 10 次调用,你再怎么搞也毫无意义,redis 延时毫秒级,数据库几十毫秒,你本地缓存搞个分布式不是把纳秒级延时生生搞到毫秒级了么,这完完全全是负优化,别钻牛角尖啊
sujin190
326 天前
@ben548 本地缓存要么是很长时间不变的,比如各种 secret ,或者集群状态缓存之类不断上报的,要么是读取频率超高,比如数十毫秒过期还能有 10 比 1 命中率的,否则没啥用的价值,redis 缓存怎么也得有 4 比 1 的命中率才有用的价值吧,否则一味搞缓存真的是负优化,纯粹就是给自己找麻烦
layxy
326 天前
本地缓存不需要做强一致性,也没办法做到强一致性,一般存到本地缓存的数据,对一致性的要求不能太高,要允许一段时间的数据更新信号和处理的时间差
lasuar
326 天前
参考楼上,你这脑回路就不太对。要是那么好做人人都能写一个分布式缓存
securityCoding
321 天前
本地缓存搞啥分布式,分布式那不就是 redis 吗?
xabcstack
231 天前
使用 redis 的消息订阅,一旦某个实例要同步,发送消息广播, 各个实例收到消息, 更新本地 cache , 达到服务器之间同步的需求

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

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

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

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

© 2021 V2EX