项目里现在用的自己实现的二级缓存,一级是基于 ConcurrentHashMap 的本地缓存,二级是 redis 缓存,这就导致了个很严重的问题,不能集群部署,因为一级缓存无法同步,集群部署,服务一切换数据就不一样了,所以想问问大佬们,有没有能支持进程之间(我们还是 docker 部署,docker 容器的进程,不行的话 linux 进程也行,就不用 docker 了)内存( jvm 的堆内存)数据同步的组件,实现成本对于我们现在这个来说也比较低的,有这种东西吗?或者自己怎么改造现有的缓存组件来实现这一目的?
1
aper 2022-03-28 11:43:29 +08:00
redis 6.0 client-side cache ,或者自己搭个 MQ 吧
|
2
decken 2022-03-28 11:46:22 +08:00
mmap
|
3
hangszhang 2022-03-28 13:04:54 +08:00
mq 同步到服务集群更新一级缓存呢?
|
4
MoYi123 2022-03-28 14:23:57 +08:00
本地缓存是确实有必要的吗? 最简单的方法是不要用本地缓存.
|
5
potatowish 2022-03-28 14:31:53 +08:00
查询频率高、几乎不需要更新的数据才会做进程缓存吧,目的就是为了减少网络和序列化开销,你这种情况应该考虑用分布式缓存
|
6
Red998 2022-03-28 14:34:37 +08:00
为什么不是一级 Redis 、二级本地兜底? 本地缓存虽然性能高、但是也有局限性 你用 ConcurrentHashMap 也要考虑内存大小、LRU 清除、定时刷新、缓存不共享问题。本地缓存考虑使用 Caffeine
|
7
ikas 2022-03-28 14:38:24 +08:00
10 年前我们用 JGroups 实现分布式同步缓存..到了如今依然没有好的办法
但是人们基本都接受了独立中央缓存这种模式 所以.... |
8
cc959798 2022-03-28 14:44:02 +08:00
量不大的话没必要本地缓存
|
9
fengjianxinghun 2022-03-28 16:09:00 +08:00
1. 一级进程级 LRU 缓存
2. 二级本机 mmap 共享内存缓存 3. 分布式 redis 缓存 4. 分布式 tidb 5. 分布式 es |
10
zmal 2022-03-28 18:00:29 +08:00
你要同步本地缓存,就大大增加了缓存技术的复杂度,有一点得不偿失。
一般是一级本地缓存过期时间尽量调短一点,损失一定的一致性来换性能。 再说你把本地缓存搞成分布式的,还要二级 redis 干嘛? |
11
wolfie 2022-03-28 18:02:54 +08:00
非要沿用现成方案的话,Redis pub/sub 写一个对 map 修改。
|
12
wolfie 2022-03-28 18:03:23 +08:00
现成方案 => 现在的方案。
|
13
tramm 2022-03-28 18:04:15 +08:00
多服务器间同步缓存数据, 本质上不就是 Redis 了.
没必要用一级缓存了啊 |
14
sunriz 2022-03-28 19:05:59 +08:00
先要问问用本地缓存收益高吗。本地缓存本质上就是用一致性换速度,一般都存静态的东西,或者实时性不敏感的数据。
本地缓存跨机器同步就增加复杂度了,楼上说的对,这本身就是 redis 这种存储组件专门做的事情 |
15
wccc 2022-03-28 20:47:52 +08:00 via iPhone
redisson localcachemap
或者 redis 发布订阅更新本地缓存 断开 redis 清空本地缓存 |
16
mezi04 2022-03-29 12:24:04 +08:00
Hazelcast 或许能满足你的需求
|
17
pumpkin2011 2022-03-29 15:09:13 +08:00
if (time % 10 == 0) {
reload() // async return oldData } |
18
orzwalker111 2022-03-29 18:17:42 +08:00
分析实际使用场景,实时性要求很高,用 1 ;否则 2
1 、干掉本地缓存,只用远端缓存 2 、保留本地缓存,本地缓存设置很小的过期时间,1 秒?从本地缓存读数据,过期的话读远端再写本地 |