V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Aliberter
V2EX  ›  程序员

分布式本地缓存的问题

  •  
  •   Aliberter · 2022-03-28 11:40:21 +08:00 · 2846 次点击
    这是一个创建于 970 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目里现在用的自己实现的二级缓存,一级是基于 ConcurrentHashMap 的本地缓存,二级是 redis 缓存,这就导致了个很严重的问题,不能集群部署,因为一级缓存无法同步,集群部署,服务一切换数据就不一样了,所以想问问大佬们,有没有能支持进程之间(我们还是 docker 部署,docker 容器的进程,不行的话 linux 进程也行,就不用 docker 了)内存( jvm 的堆内存)数据同步的组件,实现成本对于我们现在这个来说也比较低的,有这种东西吗?或者自己怎么改造现有的缓存组件来实现这一目的?

    18 条回复    2022-03-29 18:17:42 +08:00
    aper
        1
    aper  
       2022-03-28 11:43:29 +08:00
    redis 6.0 client-side cache ,或者自己搭个 MQ 吧
    decken
        2
    decken  
       2022-03-28 11:46:22 +08:00
    mmap
    hangszhang
        3
    hangszhang  
       2022-03-28 13:04:54 +08:00
    mq 同步到服务集群更新一级缓存呢?
    MoYi123
        4
    MoYi123  
       2022-03-28 14:23:57 +08:00
    本地缓存是确实有必要的吗? 最简单的方法是不要用本地缓存.
    potatowish
        5
    potatowish  
       2022-03-28 14:31:53 +08:00
    查询频率高、几乎不需要更新的数据才会做进程缓存吧,目的就是为了减少网络和序列化开销,你这种情况应该考虑用分布式缓存
    Red998
        6
    Red998  
       2022-03-28 14:34:37 +08:00
    为什么不是一级 Redis 、二级本地兜底? 本地缓存虽然性能高、但是也有局限性 你用 ConcurrentHashMap 也要考虑内存大小、LRU 清除、定时刷新、缓存不共享问题。本地缓存考虑使用 Caffeine
    ikas
        7
    ikas  
       2022-03-28 14:38:24 +08:00
    10 年前我们用 JGroups 实现分布式同步缓存..到了如今依然没有好的办法
    但是人们基本都接受了独立中央缓存这种模式
    所以....
    cc959798
        8
    cc959798  
       2022-03-28 14:44:02 +08:00
    量不大的话没必要本地缓存
    fengjianxinghun
        9
    fengjianxinghun  
       2022-03-28 16:09:00 +08:00
    1. 一级进程级 LRU 缓存
    2. 二级本机 mmap 共享内存缓存
    3. 分布式 redis 缓存
    4. 分布式 tidb
    5. 分布式 es
    zmal
        10
    zmal  
       2022-03-28 18:00:29 +08:00
    你要同步本地缓存,就大大增加了缓存技术的复杂度,有一点得不偿失。
    一般是一级本地缓存过期时间尽量调短一点,损失一定的一致性来换性能。

    再说你把本地缓存搞成分布式的,还要二级 redis 干嘛?
    wolfie
        11
    wolfie  
       2022-03-28 18:02:54 +08:00
    非要沿用现成方案的话,Redis pub/sub 写一个对 map 修改。
    wolfie
        12
    wolfie  
       2022-03-28 18:03:23 +08:00
    现成方案 => 现在的方案。
    tramm
        13
    tramm  
       2022-03-28 18:04:15 +08:00
    多服务器间同步缓存数据, 本质上不就是 Redis 了.
    没必要用一级缓存了啊
    sunriz
        14
    sunriz  
       2022-03-28 19:05:59 +08:00
    先要问问用本地缓存收益高吗。本地缓存本质上就是用一致性换速度,一般都存静态的东西,或者实时性不敏感的数据。
    本地缓存跨机器同步就增加复杂度了,楼上说的对,这本身就是 redis 这种存储组件专门做的事情
    wccc
        15
    wccc  
       2022-03-28 20:47:52 +08:00 via iPhone
    redisson localcachemap
    或者 redis 发布订阅更新本地缓存 断开 redis 清空本地缓存
    mezi04
        16
    mezi04  
       2022-03-29 12:24:04 +08:00
    Hazelcast 或许能满足你的需求
    pumpkin2011
        17
    pumpkin2011  
       2022-03-29 15:09:13 +08:00
    if (time % 10 == 0) {
    reload() // async
    return oldData
    }
    orzwalker111
        18
    orzwalker111  
       2022-03-29 18:17:42 +08:00
    分析实际使用场景,实时性要求很高,用 1 ;否则 2
    1 、干掉本地缓存,只用远端缓存
    2 、保留本地缓存,本地缓存设置很小的过期时间,1 秒?从本地缓存读数据,过期的话读远端再写本地
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2792 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:51 · PVG 19:51 · LAX 03:51 · JFK 06:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.