如何实现多级缓存以及缓存之间数据的一致性

文章目录

  • 神领物流 -- 如何实现多级缓存以及缓存之间数据的一致性
    • 一. 为什么要使用多级缓存?
    • 二. 为什么要选择MongoDB作为数据库
    • 三. 如何缓存之间的一致性
      • 1. 如何同步更新Redis缓存
      • 2. 如何同步更新CaffeineCache缓存

神领物流 – 如何实现多级缓存以及缓存之间数据的一致性

采用用到的技术:

  • MongoDB
  • Redis
  • CaffeineCache

一. 为什么要使用多级缓存?

在我们的项目当中 ,特别是在电商大促期间,快件数量非常庞大,也就意味着查询人的量也是很大的 , 因此读查询接口造成的并发压力也会非常大 . 因此为了处理高并发问题在这采用了多级缓存

二. 为什么要选择MongoDB作为数据库

首先对于物流的订单流转信息其主体由一个运单号作为标识以及一个列表用来保存所有的运输信息 , 比如某货物在运输过程中从A送往B , 某货物已送达B点

在这里插入图片描述

这里如果使用mysql作为数据源我们就不可避免的需要将所有的运输信息保存在另一张表中 , 然后通过运单号进行查询 , 这对MySQL的性能开销会非常大

因此在这里采取了MongoDB作为数据库 , MongoDB的嵌套保存天然支持我们的业务需求 , 同时MongoDB在处理高并发上其性能也会优于MySQL

三. 如何缓存之间的一致性

在项目当中采用CaffeineCache作为一级缓存Redis作为二 级缓存 , MongoDB作为数据源

CaffeineCache --> Redis --> MongoDB

基于这个模型 , 也就是说的哪个MongoDB数据库中的数据被修改 , 那么我们就要对缓存进行同步更新

1. 如何同步更新Redis缓存

/**
     * 如果运单数据不存在,就创建,否则更新数据
     *
     * @param transportOrderId 运单id
     * @param infoDetail       信息详情
     * @return 运输信息数据
     */
    @CachePut(value = "transport-info", key = "#p0")
    @Override
    public TransportInfoEntity saveOrUpdate(String transportOrderId, TransportInfoDetail infoDetail) {
        TransportInfoEntity mongoTemplateOne = mongoTemplate.findOne(Query.query(Criteria.where("transportOrderId").is(transportOrderId)), TransportInfoEntity.class);
        if (ObjectUtil.isEmpty(mongoTemplateOne)){
            mongoTemplateOne.setId(new ObjectId());
            mongoTemplateOne.setTransportOrderId(transportOrderId);
            mongoTemplateOne.setInfoList(ListUtil.toList(infoDetail));
            mongoTemplateOne.setUpdated(System.currentTimeMillis());
        }else {
            mongoTemplateOne.getInfoList().add(infoDetail);
        }
        //无论新增还是更新都要设置更新时间
        mongoTemplateOne.setUpdated(System.currentTimeMillis());
        //保存/更新到MongoDB
        return this.mongoTemplate.save(mongoTemplateOne);
    }

在对数据的更新同时我们使用SpringCache集成redis , 并使用其更新注解 @CachePut(value = “transport-info”, key = “#p0”)对redis数据同步更新 , 这样就解决了数据库与redis之间的缓存更新问题

2. 如何同步更新CaffeineCache缓存

对于CaffeineCache来说它是基于JVM级别的缓存 , 也就是说在搭建了集群后如果不对其同步很有可能导致不同机器上的CaffeineCache缓存数据不同

为了解决这个问题 , 我们通过使用redis内部的发布订阅来实现 , 也就是说每当Redis的数据被更新 , 我们就会向指定的key发生一个消息

其原理就是redis支持对key的订阅 , 同时可以进行监听 , 当该key发生变化时就会调用CaffeineCache删除指定运单的缓存

/**
 * redis消息监听,解决Caffeine一致性的问题
 */
@Component
public class RedisMessageListener extends MessageListenerAdapter {
    @Resource
    private Cache<String, TransportInfoDTO> transportInfoCache;
    @Override
    public void onMessage(Message message, byte[] pattern) {
        //获取到消息中的运单id
        String transportOrderId = Convert.toStr(message);
        //将本jvm中的缓存删除掉
        this.transportInfoCache.invalidate(transportOrderId);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/930307.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哈希处理海量数据

接下来我们将以问题的形式来介绍如何用hash处理海量数据。 1.问题1 &#xff08;位图&#xff09; 给定100亿个整数&#xff0c;设计算法找到只出现一次的。 1.1问题分析 100亿个整数&#xff0c;一个整数占用4byte&#xff0c;那么就需要约40G左右的空间来存储。显然常见的…

锐捷Web认证

文章目录 Web认证二代 Web 认证配置 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Datacom专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月6日11点40分 Web认证 Portal 认证、Web认证 Web认证的介绍 Web 认证使用浏览器进行身份验…

深入剖析 Profinet 转 EtherCAT 网关模块的配置流程

有一个工厂需要将西门子S7-1200 PLC与伺服驱动进行通讯&#xff0c;因PLC支持PROFINET而伺服驱动需EtherCAT协议&#xff0c;无法直接通讯。采用捷米特&#xff08;JM-ECTM-PN&#xff09;智能的Profinet转EtherCAT网关模块解决此问题&#xff0c;需导入GSD文件、设定IP和设备名…

【C++习题】17.栈的弹出压入序列

题目&#xff1a; 链接&#x1f517;&#xff1a;栈的弹出压入序列 题目&#xff1a; 代码&#xff1a; class Solution { public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {//入栈和出栈的元素个数必须相同if(pushV.size() ! popV.size())return …

【计算机网络】VLAN及IPVLAN技术解析

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了学习VLAN相关知识的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于 使用VMware组建VLAN网络实验环境 进行的&#xff0c;每个…

【Java】—— 继承

1.继承 1.1 为什么需要继承 在使用类的时候&#xff0c;是将生活中的实物&#xff0c;抽象到代码中进行表示&#xff0c;在生活中&#xff0c;很多实物都是存在关联的&#xff0c;例如 哈士奇、中华田园犬、萨摩耶 都是狗&#xff0c;他们有共性信息&#xff0c;也有属于自己…

2024-12-06 Unity Addressables3——资源加载

文章目录 1 引用加载1.1 Addressables 的资源引用类1.2 加载资源1.3 加载场景1.4 释放资源 2 Label 介绍3 动态加载3.1 加载单个资源3.2 加载多个资源 Unity 版本&#xff1a;6000.0.26f1c1Addressables 版本&#xff1a;2.3.1 1 引用加载 1.1 Addressables 的资源引用类 Ass…

【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容

目录 1. Introduction&#xff1a;介绍 Registry 的作用和功能。2. Registry Contents&#xff1a;详细描述 Registry 的结构和内容&#xff0c;包括各个部分的条目类型。2.1. DIMSPEC ENTRIES&#xff08;维度规格条目&#xff09;2.2. STATE ENTRIES&#xff08;状态变量条目…

在阿里云/Linux环境搭建Gitblit服务

在阿里云/Linux环境搭建Gitblit服务 1. 整体描述2. 前期准备3. 安装步骤3.1 下载gitblit3.2 上传gitblit3.3 解压文件3.4 修改文件配置3.5 启动gitblit3.6 安全组配置 4. 总结 1. 整体描述 前段时间买了一个阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽的配置&#x…

鸿蒙arkts怎么打印一个方法的调用堆栈

做鸿蒙开发的时候&#xff0c;也想看一下一个方法到底是哪里调用的&#xff0c;工程太大&#xff0c;断点太麻烦&#xff0c;可以加堆栈日志。 在你的方法中加上这两句&#xff0c;就可以跟到堆栈日志 let err new Error() console.log(>>>>>>err.stack) …

116. UE5 GAS RPG 实现击杀掉落战利品功能

这一篇&#xff0c;我们实现敌人被击败后&#xff0c;掉落战利品的功能。首先&#xff0c;我们将创建一个新的结构体&#xff0c;用于定义掉落体的内容&#xff0c;方便我们设置掉落物。然后&#xff0c;我们实现敌人死亡时的掉落函数&#xff0c;并在蓝图里实现对应的逻辑&…

亚马逊云服务器Amazon EC2

一、什么是Amazon EC2&#xff1f; Amazon Elastic Compute Cloud (Amazon EC2) 在 Amazon Web Services (AWS) 云中提供按需、可扩展的计算容量。使用 Amazon EC2 可降低硬件成本&#xff0c;让您能够更快地开发和部署应用程序。您可以使用 Amazon EC2 启动任意数量的虚拟服务…

Word 右键内容不显示段落/字体问题解决

有时需要调整图片的行间距&#xff0c;但是右键图片所在行&#xff0c;没有段落的选项。 可以将焦点保持在图片所在行&#xff0c;然后点击右下角的图标。同理不显示字体也可以点击左边字体中的右下角图标。

学生公寓智能限电系统的功能和作用

学生公寓智能限电系统‌是一种用于管理和限制学生公寓用电的设备和技术&#xff0c;旨在确保用电安全、防止火灾事故&#xff0c;并促进节能减排。以下是关于学生公寓智能限电系统的详细介绍&#xff1a; 1、功能和作用 智能限电系统通过以下功能来管理和限制用电&#xff1a…

[IT项管理(双语)]项目的基本概念

什么是项目 1.1项目的定义 项目&#xff08;project&#xff09;是为了创造一个特定的产品&#xff0c;服务&#xff0c;或者成果而采用的临时性的努力。 项目 产出唯一 临时性 1.2运营的定义 运营&#xff08;operation&#xff09;是 为了维持业务而进行的工作。 Imp1.3运…

ASP.NET Core SignalR 双工通信

01. 介绍 &#x1f3af; ASP.NET Core SignalR 是一个开放源代码库&#xff0c;它简化了向应用添加实时 Web 功能的过程。 实时 Web 功能使服务器端代码可以在服务器上激发事件时将事件推送到连接的客户端。 使用 SignalR&#xff0c;客户端也可以将消息发送到服务器&#xff…

Sonar基于SonarQube统一产品命名,助力提升开发者体验,以及本地、云端或IDE端的代码质量与安全

日前&#xff0c;领先的代码质量和安全解决方案提供商Sonar宣布&#xff0c;将围绕SonarQube简化其现有的产品命名。 作为Sonar的旗舰品牌&#xff0c;SonarQube代表了公司的核心使命&#xff1a;提高所有代码的质量和安全性&#xff0c;同时提供更好的开发人员体验。这些变化…

搭建高可用负载均衡系统:Nginx 与云服务的最佳实践

搭建高可用负载均衡系统&#xff1a;Nginx 与云服务的最佳实践 引言 在项目开发过程中&#xff0c;我们通常在开发和测试阶段采用单机架构进行开发和测试。这是因为在这个阶段&#xff0c;系统的主要目的是功能实现和验证&#xff0c;单机架构足以满足开发人员的日常需求&…

芯科科技突破性超低功耗Wi-Fi 6和低功耗蓝牙5.4模块加速设备部署

致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;今日宣布推出SiWx917Y超低功耗Wi-Fi 6和低功耗蓝牙&#xff08;Bluetooth LE&#xff09;5.4模块。 作为成功的第二代无线开发平台的新产品&…

CentOS7虚拟机 网络适配器 NAT模式和桥接模式区别

一、环境介绍 宿主机&#xff1a;Windows电脑 虚拟机&#xff1a;VMware下的CentOS7 局域网&#xff1a;路由器下的各真实主机组成的网络 内部局域网&#xff1a;宿主机构建的一个内部网路 二、NAT和桥接网络链接模式区别 NAT模式&#xff1a;相当于宿主机构建一个内部局域网&a…