项目里现在用的自己实现的二级缓存,一级是基于 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 fkmc 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 秒?从本地缓存读数据,过期的话读远端再写本地 |