MyBatis Plus 在 ZKmall开源商城持久层的优化实践

news2025/4/7 23:53:31

ZKmall开源商城作为基于 Spring Cloud 的高性能电商平台,其持久层通过 MyBatis Plus 实现了多项深度优化,涵盖分库分表、缓存策略、分页性能、多租户隔离等核心场景。以下是具体实践总结:

一、分库分表与插件集成优化

1. 分库分表策略

  • ShardingSphere 集成:通过 DynamicTableNameInnerInterceptor 动态路由表名,实现订单表按月分表(如 t_order_202304),结合 ShardingSphere 配置数据源分片规则。
  • 分片算法优化:基于用户 ID 的哈希取模分库(如 ds${user_id % 2}),订单 ID 哈希分表,避免数据倾斜。

yaml

# ShardingSphere 分片规则(application-sharding.yml)
spring.shardingsphere.rules.sharding.tables.t_order:
  actualDataNodes: ds${0..1}.t_order_${0..1}
  databaseStrategy: inline(shardingColumn=user_id, algorithm-expression=ds${user_id % 2})
  tableStrategy: inline(shardingColumn=order_id, algorithm-expression=t_order_${order_id % 2})

2. 插件链式加载

  • 插件优先级管理:按顺序加载多租户插件→分页插件→数据权限插件,确保 SQL 改写逻辑正确性。
  • 多租户隔离:通过 TenantLineInnerInterceptor 自动注入租户 ID(tenant_id),实现数据物理隔离。
二、分页性能深度优化

1. 分页插件调优

  • 物理分页替代逻辑分页:采用 MyBatis Plus 的 PaginationInnerInterceptor,自动生成数据库方言分页 SQL(如 MySQL 的 LIMIT),避免内存分页压力。
  • 深度分页优化:针对百万级订单数据,使用基于主键 ID 的游标分页(WHERE id > #{lastId} LIMIT #{size}),替代 OFFSET 分页,降低全表扫描开销。

2. 分段查询与索引优化

  • 热点数据分段:将高频访问的订单数据拆分为多个虚拟段(如 order_segment_1~order_segment_10),通过哈希路由分散锁竞争,实测 QPS 提升 8 倍。
  • 联合索引覆盖:为分页查询字段(如 user_id + create_time)建立联合索引,减少回表查询。
三、缓存与二级存储策略

1. 二级缓存配置

  • Redis 集成:在 Mapper XML 中配置 <cache type="org.mybatis.caches.redis.RedisCache">,结合 LRU 淘汰策略与 10 分钟刷新间隔,降低数据库负载。
  • 热点数据预加载:通过 @CacheRefresh 注解异步刷新高频访问数据(如商品详情),结合 TTL 策略保障数据一致性。

2. 批量操作优化

  • JDBC 批量插入:使用 MyBatis Plus 的 saveBatch 方法,结合 rewriteBatchedStatements=true 参数,提升批量插入效率(实测 10 万条数据插入耗时减少 65%)。
四、代码生成与自动化工具

1. 代码生成器应用

  • 模块化代码生成:基于 MyBatis Plus 的代码生成器,自动生成 Entity、Mapper、Service 层代码,支持自定义模板(如 DTO、VO 转换逻辑),开发效率提升 40%。
  • Lombok 集成:通过 @Data 与 @Builder 注解简化实体类,减少冗余代码。

2. 动态 SQL 与条件构造器

  • LambdaQueryWrapper:使用链式条件构造器动态拼接查询条件(如 eq(User::getName, "Tom").ge(User::getAge, 18)),避免 SQL 注入风险。
  • 注解式动态 SQL:通过 @SelectProvider 实现复杂查询逻辑的动态生成(如多维度订单统计)。
五、高并发场景实践

1. 分布式锁与事务

  • Redis 锁集成:在库存扣减场景中,结合 Redisson 的 RLock 实现分布式锁,防止超卖。
  • Seata 分布式事务:通过 @GlobalTransactional 注解保障跨服务事务一致性(如创建订单→扣减库存→生成支付单)。

2. 慢 SQL 监控与治理

  • P6Spy 日志分析:集成 SQL 监控插件,记录执行耗时与参数详情,定位慢查询(如超过 500ms 的订单统计 SQL)。
  • Prometheus 可视化:通过 actuator 端点暴露指标,结合 Grafana 监控缓存命中率与锁竞争情况。

演进方向

ZKmall开源商城 通过 MyBatis Plus 的插件扩展、缓存分层、分页算法优化等策略,在万级 QPS 场景下实现了毫秒级响应。未来计划:

  1. AOT 预编译支持:ZKmall开源商城结合 Spring Boot 3 的 AOT 模式,预生成 MyBatis Mapper 代理类,减少运行时反射开销

  2. 向量化查询:针对商品搜索场景,探索基于 ClickHouse 的向量化分页插件,提升亿级数据检索效率。

ZKmall开源商城官网:https://ceres.zkthink.com/zkmall-pc/
ZKmall源码地址:https://gitee.com/zkmall/b2c

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rust 同时处理多个异步任务,并在一个任务完成退出

use std::thread; use tokio::{sync::mpsc,time::{sleep, Duration}, };async fn check_for_one() {// 该函数会每秒打印一次 "write"loop {println!("write");sleep(Duration::from_secs(1)).await;} }async fn start_print_task() -> Result<(), (…

使用注解开发springMVC

引言 在学习过第一个springMVC项目建造过后&#xff0c;让我们直接进入真实开发中所必需的注解开发&#xff0c; 是何等的简洁高效&#xff01;&#xff01; 注&#xff1a;由于Maven可能存在资源过滤的问题&#xff0c;在maven依赖中加入 <build><resources>&l…

【Axure元件分享】时间范围选择器

时间范围选择器下拉选择开始时间和结束时间&#xff0c;实现效果如下。 源文件截图&#xff1a; 元件获取方式&#xff1a;

【Linux操作系统——学习笔记三】Linux环境下多级目录构建与管理的命令行实践报告

1.在用户主目录下&#xff0c;使用以下方法新建目录&#xff0c;并显示详细执行过程&#xff1a; &#xff08;1&#xff09;使用绝对路径在当前目录下创建 new_dir目录 &#xff08;2&#xff09;使用相对路径、在当前目录创建dir1、dir2、dir3目录 &#xff08;3&#xff09…

C# 与 相机连接

一、通过组件连接相机 需要提前在VisionPro里面保存一个CogAcqFifoTool相机工具为 .vpp 定义一个相机工具 CogAcqFifoTool mAcq null;将保存的相机工具放入mAcq中 string path “C:\Acq.vpp”; mAcq (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(path);给窗口相机…

JAVA学习小记之IO流04--转换流篇

转换流: 按照A规则存储&#xff0c;同样按照A规则解析&#xff0c;那么就能显示正确的文本符号。反之&#xff0c;按照A规则存储&#xff0c;再按照B规则解析&#xff0c;就会导致乱码现象。 转换的原因是&#xff1a; 有的文件并非是按UTF-8编码&#xff0c;那么在读文件内容…

SH 和 BASH 有什么不同 ?

当谈到 shell 脚本编写时&#xff0c;经常出现两个突出的 shell&#xff0c;Bourne shell (SH) 和 Bourne Again shell (Bash)。两者都是基于 unix 和 linux 的系统的组成部分&#xff0c;提供与操作系统交互的接口。本文旨在深入研究这两种 shell 之间的复杂差异&#xff0c;揭…

Qt 音乐播放器项目

具体代码见&#xff1a;https://gitee.com/Suinnnnnn/MusicPlayer 文章目录 0. 预备1. 界面1.1 各部位长度1.2 ui文件1.3 窗口前置设置1.4 设置QSS 2. 自定义控件2.1 按钮2.2 推荐页面2.3 CommonPage2.4 滑杆 3. 音乐管理4. 歌词界面4.1 ui文件4.2 LrcPage.h文件 5. 音乐播放控…

.NET用C#在PDF文档中添加、删除和替换图片

在当今数字化文档处理场景中&#xff0c;动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一。通过C#在.NET平台实现图片的添加、替换和删除功能&#xff0c;不仅能显著提升PDF文档的视觉表现力与信息承载效率&#xff0c;更可满足数据动态更新、内容精准维护等复杂业…

anaconda安装使用+pytorch环境配置(cpu)+pycharm环境配置(详细教程)

一、anaconda下载 1.anaconda官网尝试下载&#xff1a; 官网网址&#xff1a;Anaconda | Built to Advance Open Source AI 1.进入官网 2.点击Products->Distribution&#xff0c;跳过注册进入下载页面 3.选择系统下载 2.清华镜像下载 1.网址&#xff1a;Index of /anac…

c++STL入门

目录 什么是STL&#xff1f; vector容器 构造函数 赋值操作 vector容量和大小 vector存放内置数据类型 vector存放自定义数据类型 存放指针 vector容器嵌套容器 string容器 构造函数 赋值操作 字符串拼接 查找和替换 string字符串比较 string字符存取 string插…

electron-update + nginx热更新

1.安装"electron-updater": “^6.6.2”, npm i electron-updater2.创建checkUpdate.js // 引入自动更新 const {autoUpdater} require(electron-updater); const { dialog } require(electron); // 自动更新检查 export function checkForUpdates() {// 检查新版…

前端知识点---本地存储(javascript)

localStorage 是浏览器提供的一个 本地存储 API&#xff0c;可以在用户的浏览器中存储数据&#xff0c;数据不会随页面刷新而丢失。 1. 基本用法 (1) 存储数据&#xff08;setItem&#xff09; localStorage.setItem("username", "zhangsan");存储 “use…

QML 批量创建模块 【Repeater】 组件详解

在 QML 中&#xff0c;Repeater 组件是一种非常实用的工具&#xff0c;能够批量创建控件&#xff0c;尤其是在我们需要根据数据动态生成多个相同类型的控件时。无论是列表、网格&#xff0c;还是动态生成按钮、标签等控件&#xff0c;Repeater 都能轻松胜任。 1. Repeater 组件…

【Python】Python 环境 + Pycharm 编译器 官网免费下载安装(图文教程,新手安装,Windows 10 系统)

目录 Python 环境的下载安装第一步 进入官网第二步 找到匹配 windows 系统的 python 下载页面第三步 根据电脑 cpu 架构选择 python 版本第四步 安装 python 环境第五步 验证 python 环境变量 Pycharm 的下载安装第一步 进入官网第二步 安装 Pycharm Community Edition第三步 第…

在 Elasticsearch 中使用 Amazon Nova 模型

作者&#xff1a;来自 Elastic Andre Luiz 了解如何在 Elasticsearch 中使用 Amazon Nova 系列模型。 在本文中&#xff0c;我们将讨论 Amazon 的 AI 模型家族——Amazon Nova&#xff0c;并学习如何将其与 Elasticsearch 结合使用。 关于 Amazon Nova Amazon Nova 是 Amazon …

sql server数据库可疑修复

sql server数据库可疑修复 从上图可以看到数据库nchrdb显示可疑&#xff0c;导致原因为NC系统在增加公共薪资项目的时候&#xff0c;扩展字段报错了&#xff0c;第一次遇到这种情况&#xff0c;折腾了很久终于解决&#xff0c;记下解决方案&#xff1a; 1&#xff0c;将SQL数据…

【项目管理-高项】学习方法 整体概览

相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 &#x1f4dd; 软考高项,全称 信息系统项目管理师 ,是软考高级资格项目之一。 本考试考三门科目&#xff1a;综合知识&#xff08;上午&#xff09;、案例分析&#xff08;下午…

【Linux网络与网络编程】05.应用层自定义协议序列化和反序列化

前言 本篇博客通过网络计算器的实现来帮助各位理解应用层自定义协议以及序列化和反序列化。 一、认识自定义协议&&序列化和反序列化 我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序都是在应用层。前面我们说到&#xff1a;协议是一种…

Flutter之页面布局二

目录&#xff1a; 1、列表布局1.1、基础列表1.2、水平滑动的列表1.3、网格列表1.3、不同列表项的列表1.4、包含间隔的列表1.6、长列表 2、滚动2.1、浮动的顶栏2.2、平衡错位滚动 1、列表布局 1.1、基础列表 import package:flutter/material.dart;void main() > runApp(con…