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

分布式本地缓存的问题

  •  
  •   Aliberter · 91 天前 · 1712 次点击
    这是一个创建于 91 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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