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