架构师方案-本地缓存一致性刷新方案

前言

本地缓存和业务请求在同一台机器上,相对于Redis读写速度非常快,对于一些变更频率低、实时性要求低的数据,可以放在本地缓存中,提升访问速度。 使用本地缓存能够减少和Redis类集中式缓存间的数据交互,减少网络I/O开销,降低这一过程中在网络通信上的耗时,同时减轻对Redis类集中式缓存访问压力。

解决方案

服务是多节点部署的,要保证是本地缓存一致性的,就要短时间内操作所有服务。

方案1-MQ广播消息

redis发布订阅功能实现同理

方案2-Zookeeper Watcher机制

Tomcat Watcher监听

typescript 复制代码
@Service
public class ZkDataListenerImpl implements IZkDataListener {
    @Override
    public void handleDataChange(String dataPath, Object data) throws Exception {
        String type = getType(data);
        if (type.equals("update")) {
            //更新缓存
       
        }
        if (type.equals("delete")) {
          //删除缓存
        }
    }

}

方案3-RPC框架广播调用(如dubbo广播调用方式)

ini 复制代码
<dubbo:service cluster="broadcast" />

实现逻辑

  1. 循环调用所有的实例
  2. 如果有发生异常则记录异常保存
  3. 只要有异常,则抛出异常,如果没有则返回执行结果

源码

scala 复制代码
public class BroadcastClusterInvoker<T> extends AbstractClusterInvoker<T> {

    private static final Logger logger = LoggerFactory.getLogger(BroadcastClusterInvoker.class);

    public BroadcastClusterInvoker(Directory<T> directory) {
        super(directory);
    }

    @Override
    @SuppressWarnings({"unchecked", "rawtypes"})
    public Result doInvoke(final Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
        // 检查 invokers 是否为空
        checkInvokers(invokers, invocation);

        // 将invokers 塞到context中
        RpcContext.getContext().setInvokers((List) invokers);
        RpcException exception = null;
        Result result = null;

        // 遍历invokers 执行, 结果只要最后一个不报错的result
        for (Invoker<T> invoker : invokers) {
            try {
                result = invoker.invoke(invocation);
            } catch (RpcException e) {
                exception = e;
                logger.warn(e.getMessage(), e);
            } catch (Throwable e) {
                exception = new RpcException(e.getMessage(), e);
                logger.warn(e.getMessage(), e);
            }
        }
        // 如果出现一个异常,  抛出异常
        if (exception != null) {
            throw exception;
        }
        return result;
    }
}

方案4-分布式任务调度的广播执行任务

广播执行表示一个任务实例会广播到该分组所有Worker上执行,当所有Worker都执行完成。

方案对比

方案 特点
MQ广播消息 有消息积压、消息顺序的问题
Zookeeper Watcher机制 Zookeeper本身适合读多写少的场景
RPC框架广播调用(如dubbo广播调用方式) 循环调用所有的实例,所有要考虑实例过多的情况
分布式任务调度的广播执行任务 便于定时发布

总结

从以上这些方案,不难看出,只要有广播功能特点的中间件或服务,都可以用来操作本地缓存或者本地方法。
相关推荐
珠海西格电力3 小时前
零碳园区的能源供给成本主要包括哪些方面?
大数据·分布式·微服务·架构·能源
神奇的程序员3 小时前
重构了自己5年前写的截图插件
前端·javascript·架构
养肥胖虎3 小时前
Docker学习笔记:后端、数据库和反向代理怎么一起跑起来
后端·nginx·docker·postgresql·go·部署
Luhui Dev3 小时前
Anthropic 2026 最新 Agent Harness 架构完整拆解:Managed Agents
人工智能·架构·agent·luhuidev
晓杰'4 小时前
从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
无所事事O_o4 小时前
二次验证码TOTP 使用说明
后端·二次验证码·谷歌验证器
xifangge20255 小时前
【深度架构】Claude Code + Opus 4.6 全流程调优:API 路由重定向技术与 Agentic 编程流实战(附零成本接入方案)
架构·claudecode·opus4.6
ltl5 小时前
Multi-Head Attention:为什么要分多个头
后端
ltl5 小时前
Scaled Dot-Product:那个根号 d_k 是怎么来的'
后端
闵孚龙5 小时前
Claude Code API通信层全解析:重试、流式、降级、Fast Mode、Prompt Cache 与 Files API 的底层工程
人工智能·架构·prompt