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

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

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

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

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

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

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

© 2021 V2EX