ShardingSphere分库分表实战之绑定表

news2024/10/5 4:38:10

在这里插入图片描述

🚀 ShardingSphere 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 ShardingSphere 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

    • 🍀 一.ShardingSphere项目实战集群环境准备
    • 🍀 二.ShardingSphere分库分表实战之绑定表
      • 🥦 2.1 绑定表概念
      • 🥦 2.2 需求分析说明
      • 🥦 2.2 数据库创建
    • 🍀 三.SpringBoot项目中水平分表的配置
      • 🥦 3.1 配置文件 - 基本配置
      • 🥦 3.2 配置文件 - 数据源
      • 🥦 3.3 配置文件 - 配置数据节点
      • 🥦 3.4 配置文件 - 配置分片策略(包括分片键和分片算法)
        • 🍈 3.4.1 分片键配置
        • 🍈 3.4.2 分片算法配置
      • 🥦 3.5 配置文件 - 分布式序列配置
        • 🍈 3.5.1 UUID
        • 🍈 3.5.2 SNOWFLAKE
      • 🥦 3.6 配置文件 - 绑定表信息配置
    • 🍀 四.SpringBoot项目相关代码准备
      • 🥦 4.1 实体类编写
      • 🥦 4.2 Mapper编写
      • 🥦 4.3 配置绑定表
        • 🍈 4.3.1 编写对应的SQL语句
        • 🍈 4.3.2 封装接收的对象
        • 🍈 4.3.3 编写CourseMapper数据接口层方法
    • 🍀 五.水平分库 & 水平分表绑定表测试
      • 🥦 5.1 添加数据测试
      • 🥦 5.2 水平分库 & 水平分表绑定表测试
    • 🍀 六.总结
    • 💬 七.共勉

🍀 一.ShardingSphere项目实战集群环境准备

关于项目启动需要提前准备并进行配置的环境我在上一篇文章中做了详细的讲解,如果还有问题的同学可以参考上一篇文章进行学习。

ShardingSphere项目实战集群环境准备
ShardingSphere分库分表实战之水平分表
ShardingSphere分库分表实战之水平分库和水平分表

🍀 二.ShardingSphere分库分表实战之绑定表

特别说明:本篇文章需要建立在上一篇文章的基础上进行的项目实操,如果有问题的同学可以先学习上一篇文章,再来看这篇博客就会更好的理解!博主地址如下所示:

ShardingSphere分库分表实战之水平分库和水平分表

🥦 2.1 绑定表概念

绑定表是分片规则一致的关系表,分为主表和子表,例如t_order和t_order_item,均按照order_id分片,则此两个表互为绑定表关系。

绑定表之间的多表关联查询不会出现笛卡尔积关联,可以提升关联查询效率。
绑定表是建立在多表关联的基础上的.所以我们先来完成多表关联的配置。

🥦 2.2 需求分析说明

不变的需求:


  1. 在node1-shardingsphere 192.168.10.132服务器上, 创建数据库 ljw_course_db1;然后创建表 t_course_1 、 t_course_2 ;
  2. 在node2-shardingsphere 192.168.10.133服务器上, 创建数据库 ljw_course_db2;然后创建表 t_course_1 、 t_course_2;
  3. 约定规则:
  • 水平分库规则 :以user_id为分片键,分片策略为user_id % 2 +1,user_id为偶数操作db1数据源,否则操作db2数据源;
  • 水平分表规则 :以cid为分片键,分片策略为Math.abs(cid.hashCode()) % 2 + 1 为偶数的时候,数据插入对应服务器的t_course_1表,反之,数据插入对应服务器的t_course_2

新加的需求:

  1. 在node1-shardingsphere 192.168.10.132服务器上, 数据库 ljw_course_db1中;然后创建表 t_course_section_1、 t_course_section_2;
  2. 在node2-shardingsphere 192.168.10.133服务器上, 创建数据库 ljw_course_db2;然后创建表 t_course_section_1、 t_course_section_2;

🥦 2.2 数据库创建

CREATE TABLE `t_course_section_1` (
  `id` bigint(11) NOT NULL,
  `cid` bigint(11) DEFAULT NULL,
  `corder_no` bigint(20) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `section_name` varchar(50) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `t_course_section_2` (
  `id` bigint(11) NOT NULL,
  `cid` bigint(11) DEFAULT NULL,
  `corder_no` bigint(20) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `section_name` varchar(50) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表结构创建完成:

在这里插入图片描述

🍀 三.SpringBoot项目中水平分表的配置

sharding-jdbc进行分库分表的配置,主要包括:数据源、分片键、主键生成策略、分片策略等。

注意:项目实战过程中有不熟的概念可以参考对应的官方网站,因为内容较多,本篇文章不做过多详细的说明,包括使用到的很多知识内容,官网开发手册都有更加详细的指导说明。

ShardingSphere开发者手册

🥦 3.1 配置文件 - 基本配置

# 应用名称
spring.application.name=sharding-jdbc-demo
# 打印SQL语句
spring.shardingsphere.props.sql-show=true
# SQL输出日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

🥦 3.2 配置文件 - 数据源

# 定义多个数据源
spring.shardingsphere.datasource.names = db1,db2

# 数据源1连接信息配置
spring.shardingsphere.datasource.db1.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db1.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.db1.url = jdbc:mysql://192.168.10.132:3306/ljw_course_db1?characterEncoding=UTF-8&useSSL=false
spring.shardingsphere.datasource.db1.username = root
spring.shardingsphere.datasource.db1.password = root

# 数据源2连接信息配置
spring.shardingsphere.datasource.db2.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db2.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.db2.url = jdbc:mysql://192.168.10.132:3306/ljw_course_db2?characterEncoding=UTF-8&useSSL=false
spring.shardingsphere.datasource.db2.username = root
spring.shardingsphere.datasource.db2.password = root

🥦 3.3 配置文件 - 配置数据节点

表达式 db1.t_course_$->{1..2}

​ $ 会被大括号中的 {1..2} 所替换, ${begin..end} 表示范围区间

​ 会有两种选择: db1.t_course_1db1.t_course_2

在这里插入图片描述

# 标准分片表配置  -  配置数据节点
# 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
spring.shardingsphere.rules.sharding.tables.t_course.actual-data-nodes=db$->{1..2}.t_course_$->{1..2}
spring.shardingsphere.rules.sharding.tables.t_course_section.actual-data-nodes=db$->{1..2}.t_course_section_$->{1..2}

注意:此处使用了行表达式,想深入了解的同学可以参考官网进行学习!

行表达式官方网站学习手册

🥦 3.4 配置文件 - 配置分片策略(包括分片键和分片算法)

分片相关内容官方网站学习手册

🍈 3.4.1 分片键配置

# 水平分库配置
# t_course表
# 分片键名称
spring.shardingsphere.rules.sharding.tables.t_course.database-strategy.standard.sharding-column=user_id

# 水平分表配置
# t_course表
# 分片键名称
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-column=cid

# 水平分库配置
# 分片列名称
# t_course_section 表
spring.shardingsphere.rules.sharding.tables.t_course_section.database-strategy.standard.sharding-column=user_id

# 水平分表配置
# t_course_section 表
# 分片键名称
spring.shardingsphere.rules.sharding.tables.t_course_section.table-strategy.standard.sharding-column=corder_no

🍈 3.4.2 分片算法配置

在配置分片算法之前,我们做如下的约定:

  • t_course水平分库规则 :以user_id为分片键,分片策略为user_id % 2 +1,user_id为偶数操作db1数据源,否则操作db2数据源;
  • t_course水平分表规则 :以cid为分片键,分片策略为Math.abs(cid.hashCode()) % 2 + 1 为偶数的时候,数据插入对应服务器的t_course_1表,反之,数据插入对应服务器的t_course_2
  • t_course_section水平分库规则:以user_id为分片键,分片策略为user_id % 2 +1,user_id为偶数操作db1数据源,否则操作db2数据源;
  • t_course_section水平分表规则:以corder_no为分片键,分片策略为Math.abs(corder_no.hashCode()) % 2 + 1,user_id为偶数操作db1数据源,否则操作db2数据源;
# t_course
# 水平分库配置
# 分片算法
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_course.database-strategy.standard.sharding-algorithm-name=table-inline
# 分片算法类型  --> 行表达式分片算法
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.type=INLINE
# 分片算法的属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.props.algorithm-expression=db$->{user_id % 2 + 1}

# 水平分表配置
# 分片算法
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-algorithm-name=inline-hash-mod
# 分片算法类型  --> hash取模算法
spring.shardingsphere.rules.sharding.sharding-algorithms.inline-hash-mod.type=INLINE
# 分片算法的属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.inline-hash-mod.props.algorithm-expression=t_course_$->{Math.abs(cid.hashCode()) % 2 + 1}

#t_course_section
#  分片算法名称
#  水平分库
spring.shardingsphere.rules.sharding.tables.t_course_section.database-strategy.standard.sharding-algorithm-name=table-mod
# 取模分片算法
spring.shardingsphere.rules.sharding.sharding-algorithms.table-mod.type=INLINE
# 分片算法属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.table-mod.props.algorithm-expression=db$->{user_id % 2 + 1}

# 水平分表
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_course_section.table-strategy.standard.sharding-algorithm-name=table-hash-mod
# 哈希取模分片算法
# 分片算法类型
spring.shardingsphere.rules.sharding.sharding-algorithms.table-hash-mod.type=INLINE
# 分片算法属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.table-hash-mod.props.algorithm-expression=t_course_section_$->{Math.abs(corder_no.hashCode()) % 2 + 1}

🥦 3.5 配置文件 - 分布式序列配置

分布式主键相关内容官方网站学习手册

🍈 3.5.1 UUID

采用 UUID.randomUUID() 的方式产生分布式主键。

实体类中对应数据库表中的主键ID代码配置

	// 省略部分代码

	// 核心配置代码
    //通过MyBatisPlus生成主键
    @TableId(value="cid",type = IdType.ASSIGN_ID)
    private Long id;
    
    // 省略部分代码

🍈 3.5.2 SNOWFLAKE

在分片规则配置模块可配置每个表的主键生成策略,默认使用雪花算法(snowflake)生成 64bit 的长整型数据。

雪花算法是由 Twitter 公布的分布式主键生成算法,它能够保证不同进程主键的不重复性,以及相同进程主键的有序性。

配置文件:

# t_course 表主键生成策略
# 分布式序列配置
# 分布式序列的列名
spring.shardingsphere.rules.sharding.tables.t_course.key-generate-strategy.column=cid
# 分布式序列-算法名称
spring.shardingsphere.rules.sharding.tables.t_course.key-generate-strategy.key-generator-name=alg-snowflake


# t_course_section 表主键生成策略
# 分布式序列列名称
spring.shardingsphere.rules.sharding.tables.t_course_section.key-generate-strategy.column=id
# 分布式序列算法名称
spring.shardingsphere.rules.sharding.tables.t_course_section.key-generate-strategy.key-generator-name=snowflake


#  -- 
# 分布式序列-算法类型
spring.shardingsphere.rules.sharding.key-generators.alg-snowflake.type=SNOWFLAKE

实体类中对应数据库表中的主键ID代码配置

	// 省略部分代码

	// 核心配置代码
    @TableId(type = IdType.AUTO)
    private Long id;
    
    // 省略部分代码

🥦 3.6 配置文件 - 绑定表信息配置

spring.shardingsphere.rules.sharding.binding-tables[0]=t_course,t_course_section

🍀 四.SpringBoot项目相关代码准备

🥦 4.1 实体类编写

编写与数据库表对应的实体类

@TableName("t_course_section")
@Data
@ToString
public class CourseSection {

    @TableId(type = IdType.AUTO)
    private Long id;

    private Long cid;

    private Long userId;

    private Long corderNo;

    private String sectionName;

    private Integer status;
}


🥦 4.2 Mapper编写

@Mapper
public interface CourseSectionMapper extends BaseMapper<CourseSection> {

}

🥦 4.3 配置绑定表

查询每个订单的订单号和课程名称以及每个课程的章节的数量

🍈 4.3.1 编写对应的SQL语句

SELECT 
  c.corder_no,
  c.cname,
  COUNT(cs.id) num
FROM t_course c INNER JOIN t_course_section cs ON c.corder_no = cs.corder_no
GROUP BY c.corder_no,c.cname;

🍈 4.3.2 封装接收的对象

@Data
public class CourseVo {

    private Long corderNo;

    private String cname;

    private Integer num;
}

🍈 4.3.3 编写CourseMapper数据接口层方法

@Mapper
public interface CourseMapper extends BaseMapper<Course> {

    @Select({"SELECT \n" +
            "  c.corder_no,\n" +
            "  c.cname,\n" +
            "  COUNT(cs.id) num\n" +
            "FROM t_course c INNER JOIN t_course_section cs ON c.corder_no = cs.corder_no\n" +
            "GROUP BY c.corder_no,c.cname"})
    List<CourseVo> selectCourseAndSection();
}

🍀 五.水平分库 & 水平分表绑定表测试

🥦 5.1 添加数据测试

	@Test
    public void test(){
        for (int i = 0; i < 6; i++) {
            Course course = new Course();
            course.setUserId(1L+i);
            course.setCorderNo(1000L+i);
            course.setCname("ShardingSphere");
            course.setBrief("ShardingSphere保姆级学习教程!!!");
            course.setPrice(100.00);
            course.setStatus(1);
            courseMapper.insert(course);

            Long cid = course.getCid();
            for (int j = 0; j < 6; j++) {
                CourseSection section = new CourseSection();
                section.setCid(cid);
                section.setUserId(1L+i);
                section.setCorderNo(1000L+i);
                section.setSectionName("ShardingSphere保姆级学习教程" + i);
                section.setStatus(1);
                courseSectionMapper.insert(section);
            }
        }
    }

结果查询

在这里插入图片描述

数据库表查询:

在这里插入图片描述

在这里插入图片描述

🥦 5.2 水平分库 & 水平分表绑定表测试

	@Test
    public void testSelectCourseAndSection(){
        List<CourseVo> list = courseMapper.selectCourseAndSection();
        list.forEach(System.out::println);
    }

结果查询

配置绑定表:控制台输出结果为4个SQL。

在这里插入图片描述

🍀 六.总结

本篇文章主要讲解了ShardingSphere分库分表实战之绑定表,多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。下节预告,ShardingSphere分库分表实战之广播表,敬请期待。

💬 七.共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

DAY48:动态规划(十二)完全平方数(类似零钱兑换)+单词拆分(注意背包思路!)

文章目录 279.完全平方数&#xff08;类似零钱兑换&#xff09;思路DP数组含义递推公式初始化遍历顺序 最开始的写法&#xff1a;有1个用例没过修改完整版总结 139.单词拆分&#xff08;递推公式注意&#xff09;思路1&#xff1a;遍历单词分割点DP数组含义递推公式初始化遍历顺…

基于Java+SpringBoot+Vue前后端分离旅游网站详细设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

导航菜单 改变背景色

直接参考官网上的案例即可 //active-text-color 点击时修改字体颜色 // background-color 背景色 // text-color 字体颜色<el-menudefault-active"2"class"el-menu-vertical-demo"open"handleOpen"close"handleClose"background…

Java:控制流程 + 数组 详解(原理 + 用法 + 例子)

目录 控制流程块作用域if 条件语句for while 循环switch 多重选择break continue 中断控制流程语句 大数值数组多维数组字符串类型数组Array.sort() 数组排序for each 循环 控制流程 块作用域 块&#xff08;即复合语句&#xff09;是指由一对大括号{}括起来的若干条简单的 Ja…

ARP解析MAC地址的全过程(ARP的工作机制)

目录 ARP解析MAC地址的过程&#xff1a; 源码等资料获取方法 以太网环境下&#xff0c;同一个网段的主机之间需要互相知道对方的MAC地址&#xff0c;才能访问。 TCP/IP协议栈从上层到下层的封装过程中&#xff0c;第三层封装需要知道目的IP&#xff0c;第二层封装需要知道目…

Linux下安装Mysql (CentOS 7) 详解

文章目录 前言环境检查查看是否安装MySql查看系统版本 源安装安装mysql的yum源官网下载从windows上传到linuxrz命令 方法2&#xff1a; 安装Mysql常见错误密钥问题安装后查看mysql是否可以工作查看是否安装成功启动服务 登录mysql配置文件方法&#xff08;免密码&#xff09; 使…

linux 安装 cuda

需求&#xff1a; inux 下安装 cuda 进程&#xff1a; 先查看一下系统版本 uname -a查看能支持什么版本的cudacuda toolkit 下载 wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run sudo sh cuda_11.1.0_4…

MySql冷门但是很有用的语句

目录 1 查看当前的所有执行的进程 查看简略信息 查看详细信息 2 在所有数据库中查询包含某个字段的表 精确 模糊 1 查看当前的所有执行的进程 查看简略信息 show processlist 查看详细信息 show full processlist 终止进程 kill id 2 在所有数据库中查询包含某个字段…

gurobi安装vs配置gurobi

gurobi安装&vs配置gurobi 1、注册账号并登录 2、下载gurobi optimizer 3、获取license:User Portal (gurobi.com) online course可以免ip验证。 4、GENERATE NOW会生成&#xff0c;打开cmd进入gurobi安装路径&#xff08;如F:\gurobi1001\win64\bin>&#xff09;&am…

分布式事务 Seata

分布式事务 Seata 事务介绍分布式理论Seata 介绍Seata 部署与集成Seata TC Server 部署微服务集成 Seata XA 模式AT 模式AT 模式执行过程读写隔离写隔离读隔离 实现 AT 模式 TCC 模式TCC 模式介绍实现 TCC 模式 Saga 模式Seata 四种模式对比 事务介绍 事务&#xff08;Transac…

分布式光伏监控系统运维系统实时查看数据分布式光伏电站监控管理

光伏电站是一种利用太阳能发电的设施&#xff0c;随着人们对可再生能源的需求不断增加&#xff0c;光伏电站的建设也越来越普遍。但是&#xff0c;光伏电站的运营和管理需要高质量的监控系统来确保其正常运行。本文将介绍光伏电站监控系统的组成及其原理。 详细软件具体需求可…

php连接上mysql数据库该的配置方法

用mysql官方的管理工具workbench&#xff1a; 打开导出界面后&#xff0c;下一步&#xff0c;选择csv格式&#xff0c;导出后excel就能打开了 如果你需要在程序代码中导出&#xff0c;需要找到对应代码的excel处理库。 如php 的 phpExcel( 最新版已更名为 phpoffice/phpspread…

vue3组件中使用live2d看板娘(官方包形式)

文章目录 先看最终效果吧关于官方包下载使用 vue3中调整使用基础使用关于样式调整 vue中Html主页调试&#xff08;备用调试方案&#xff09; 先看最终效果吧 看着还可以&#xff0c;其实还有很多问题没解决&#xff0c;因为是完全靠js渲染&#xff0c;实际上这个live2d的canvas…

前端开发多人协作的团队项目时应该要配置的一些规则

本文主要记录了团队开发一个前端项目需要进行的一些前期配置&#xff0c;例如Eslint语法检验&#xff0c;prettierrc格式化规则&#xff0c;以及提交代码时的规则等等。 目录 1.搭建项目 2.Eslint配置&#xff08;代码检验工具&#xff09; 2.1安装Eslint 2.2配置Eslint 2…

【Ajax】笔记-取消请求

在进行AJAX(Asynchronous JavaScript and XML) 请求时&#xff0c;有时候我们需要取消正在进行的请求。取消请求可以帮助我们提高用户体验&#xff0c;病减少不必要的网络流量和服务器负载。 取消请求的方法 在AJAX请求中&#xff0c;我们可以使用以下方法来取消正在进行的请求…

【大虾送书第三期】进阶高级Python开发工程师,不得不掌握的Python高并发编程

目录 ✨写在前面 ✨主要内容 ✨本书特色 ✨关于作者 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 Python成为时下技术革新的弄潮儿&#xff0c;全民Python的发展趋势让人们不再满足于简单地运行Python…

MacBook Java开发环境搭建记录

一、Homebrew的镜像设置 对于Java JDK的安装&#xff0c;我们更推荐使用Homebrew来进行安装管理。但Homebrew的curl国外源的下载速度实在是一言难尽&#xff0c;时常还会发生无法访问的情况。 那么我们此时的解决方法就有两种了&#xff0c;第一种便是使用全局的VPN代理进行下载…

SQLite Expert Personal的简单使用

官方网站&#xff1a; sqliteexpert官方网址 - SQLite administration | SQLite Expert ​—————————————————————————————————————————— 免费的受欢迎的 SQLite 管理工具 SQLite Manager 0.8.0 Firefox Plugin 这是一个 Firefox …

【MySQL】多表查询(四)

&#x1f697;MySQL学习第四站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 之前我们介绍DQL语句&#xff0c;也就是数据查询语句的时候&#xff0c;介绍的查询操作都是单表查询&#xff0c;他的功能当然…

山西电力市场日前价格预测【2023-07-20】

日前价格预测 预测明日&#xff08;2023-07-20&#xff09;山西电力市场全天平均日前电价为337.62元/MWh。其中&#xff0c;最高日前电价为375.88元/MWh&#xff0c;预计出现在06: 00。最低日前电价为291.47元/MWh&#xff0c;预计出现在13: 30。 价差方向预测 1&#xff1a;实…