Sharding-JDBC介绍及分库分表实践

1.1 ShardingSphere简介

最早是当当网内部使用的一款分库分表框架,名字叫Sharding-JDBC,定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零,适用于任何基于 JDBC 的 ORM 框架,支持任何第三方的数据库连接池,支持任意实现 JDBC 规范的数据库。
2017年的时候开始对外开源,在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为ShardingSphere。
2020年正式成为Apache软件基会的顶级项。由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。

1.2 Sharding-JDBC优点

Sharding-JDBC定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。
客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖。
Sharding-JDBC直接封装JDBC API。
旧代码迁移成本几乎为零。
适用于任何基于 JDBC 的 ORM 框架。
支持任何第三方的数据库连接池。
支持任意实现 JDBC 规范的数据库。

1.3 核心概念

1.3.1 LogicTable(逻辑表)

数据分片的逻辑表,对于水平拆分的数据库(表),同一类表的总称。例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。

1.3.2 ActualTable(真实表)

在分片的数据库中真实存在的物理表。即上个示例中的t_order_0到t_order_9。

1.3.3 DataNode(数据节点)

数据分片的最小单元。由数据源名称和数据表组成,例:ds_1.t_order_0。配置时默认各个分片数据库的表结构均相同,直接配置逻辑表和真实表对应关系即可。如果各数据库的表结果不同,可使用ds.actual_table配置。

1.3.4 BindingTable(绑定表)

指在任何场景下分片规则均一致的主表和子表。例:订单表和订单项表,均按照订单ID分片,则此两张表互为BindingTable关系。BindingTable关系的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。

1.3.5 BroadcastTable(广播表)

指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表。

1.4 分片

1.4.1 分片键

用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:订单表订单ID分片尾数取模分片,则订单ID为分片字段。SQL中如果无分片字段,将执行全路由,性能较差,支持多分片字段。

1.4.2 分片算法

1.4.2.1 精确分片算法

精确分片算法(PreciseShardingAlgorithm)精确分片算法(=与IN语句),用于处理使用单一键作为分片键的=与IN进行分片的场景。需要配合StandardShardingStrategy使用

1.4.2.2 范围分片算法

范围分片算法(RangeShardingAlgorithm)用于处理使用单一键作为分片键的BETWEEN AND进行分片的场景。需要配合StandardShardingStrategy使用。

1.4.2.3 复合分片算法

复合分片算法(ComplexKeysShardingAlgorithm)用于多个字段作为分片键的分片操作,同时获取到多个分片健的值,根据多个字段处理业务逻辑。需要在复合分片策略(ComplexShardingStrategy )下使用。

1.4.2.4 Hint分片算法

Hint分片算法(HintShardingAlgorithm)稍有不同,上边的算法中我们都是解析 语句提取分片键,并设置分片策略进行分片。但有些时候我们并没有使用任何的分片键和分片策略,可还想将 SQL 路由到目标数据库和表,就需要通过手动干预指定SQL的目标数据库和表信息,也叫强制路由。

1.4.3 分片策略

包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。真正可用于分片操作的是分片键 + 分片算法,也就是分片策略。目前提供5种分片策略。
一个好的分片策略=好的分片键+好的的分片算法

1.4.3.1 标准分片策略

对应StandardShardingStrategy。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。

1.4.3.2复合分片策略

对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。

1.4.3.3 行表达式分片策略

对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: t_user_$->{u_id % 8} 表示t_user表根据u_id模8,而分成8张表,表名称为t_user_0到t_user_7。

1.4.3.4 Hint分片策略

对应HintShardingStrategy。通过Hint而非SQL解析的方式分片的策略。

1.4.3.5 不分片策略

对应NoneShardingStrategy。不分片的策略。

1.5 分布式主键

等同于本文3.4部分

1.6 分布式事务

数据库事务需要满足ACID(原子性、一致性、隔离性、持久性)四个特性。
原子性(Atomicity)指事务作为整体来执行,要么全部执行,要么全不执行。
一致性(Consistency)指事务应确保数据从一个一致的状态转变为另一个一致的状态。
隔离性(Isolation)指多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability)指已提交的事务修改数据会被持久保存。
在单一数据节点中,事务仅限于对单一数据库资源的访问控制,称之为本地事务。几乎所有的成熟的关系型数据库都提供了对本地事务的原生支持。 但是在基于微服务的分布式应用环境下,越来越多的应用场景要求对多个服务的访问及其相对应的多个数据库资源能纳入到同一个事务当中,分布式事务应运而生。

1.6.1 本地事务

在不开启任何分布式事务管理器的前提下,让每个数据节点各自管理自己的事务。 它们之间没有协调以及通信的能力,也并不互相知晓其他数据节点事务的成功与否。 本地事务在性能方面无任何损耗,但在强一致性以及最终一致性方面则力不从心。

1.6.2 XA强一致事务

XA协议最早的分布式事务模型是X/OPEN国际联盟提出的模型,简称XA协议。
基于XA协议实现的分布式事务对业务侵入很小。 它最大的优势就是对使用方透明,用户可以像使用本地事务一样使用基于XA协议的分布式事务。 XA协议能够严格保障事务ACID特性。
严格保障事务ACID特性是一把双刃剑。 事务执行在过程中需要将所需资源全部锁定,它更加适用于执行时间确定的短事务。 对于长事务来说,整个事务进行期间对数据的独占,将导致对热点数据依赖的业务系统并发性能衰退明显。 因此,在高并发的性能至上场景中,基于XA协议的分布式事务并不是最佳选择。

1.6.3 柔性事务

如果将实现了ACID的事务要素的事务称为刚性事务的话,那么基于BASE事务要素的事务则称为柔性事务。BASE是基本可用、柔性状态和最终一致性这三个要素的缩写。
基本可用(Basically Available)保证分布式事务参与方不一定同时在线。
柔性状态(Soft state)则允许系统状态更新有一定的延时,这个延时对客户来说不一定能够察觉。
而最终一致性(Eventually consistent)通常是通过消息可达的方式保证系统的最终一致性。

1.7 读写分离

在这里插入图片描述

1.7.1 读写分离核心概念

1.7.1.1 主库

添加、更新以及删除数据操作所使用的数据库,目前仅支持单主库。

1.7.1.2 从库

查询数据操作所使用的数据库,可支持多从库。

1.7.1.3 主从同步

将主库的数据异步的同步到从库的操作。由于主从同步的异步性,从库与主库的数据会短时间内不一致。

1.7.1.4 负载均衡策略

通过负载均衡策略将查询请求疏导至不同从库。

1.7.1.5 Config Map

配置读写分离数据源的元数据,可通过调用ConfigMapContext.getInstance()获取ConfigMap中的masterSlaveConfig数据。例:如果机器权重不同则流量可能不同,可通过ConfigMap配置机器权重元数据。

1.7.2 核心功能

提供了一主多从的读写分离配置,可独立使用,也可配合分库分表使用
同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。
Spring命名空间
基于Hint的强制主库路由。

1.7.3 不支持范围

主库和从库的数据同步。
主库和从库的数据同步延迟导致的数据不一致。
主库双写或多写。

二、Sharding-JDBC实际操作

核心依赖:

		<dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>

2.1 配置分片算法前准备操作

在配置Sharding-JDBC分片算法之前,肯定都需要做的一些配置,配置数据源,数据节点,设置主键及生成算法这种基础的配置,有了这些配置之后,我们才能继续配置分片算法。

2.1.1 配置数据源

我这里设置了两个库,配置了两个数据源。
在这里插入图片描述

2.1.2 配置数据节点

$->是Sharding为我们提供的行表达式,这个表达式意思就是我们配置的数据节点为m0库course0表,m0库course1表,m1库course0表和m1库course1表,一共四个节点,这样的配置就很简便,我设置的库和表比较少,直接列举出来好像也行,但是如果分了很多库,很多表,逐个列举就会非常麻烦。
在这里插入图片描述

#数据节点
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m$->{0..1}.course$->{0..1}

2.1.3 配置全局主键及生成策略

下面为course表设置的主键是cid,用了雪花算法保证全局主键唯一。
在这里插入图片描述

#设置主键
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
#主键生成策略,雪花算法
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE

2.2 精准分片算法实践

2.2.1 配置类

首先要设置分片键设置逻辑表名为course的分表策略,这里就需要我们自定义算法类了
分库策略类似,将table-strategy改为database-strategy,设置一个分库策略的自定义算法类
在这里插入图片描述

#分片键
spring.shardingsphere.sharding.tables.course.table-strategy.standard.sharding-column=user_id
#分表策略-精准
spring.shardingsphere.sharding.tables.course.table-strategy.standard.precise-algorithm-class-name=com.mine.sharding.algorithm.MyPreciseTableShardingAlgorithm

2.2.2 自定义算法类

实现Sharding提供的精准分片接口,重写一下doSharding方法,接下来的几个分片算法,也都是差不多的操作。
在这里插入图片描述

public class MyPreciseTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
    //select * from course where cid = '' or cid in ('','')
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {
        String logicTableName = preciseShardingValue.getLogicTableName();
        String columnName = preciseShardingValue.getColumnName();
        Long cidValue = preciseShardingValue.getValue();
        //实现course$->{cid%2}
        BigInteger shardingValueB = BigInteger.valueOf(cidValue);
        BigInteger resB = shardingValueB.mod(new BigInteger("2"));
        String key = logicTableName+resB;
        if (collection.contains(key)){
            return key;
        }
        throw new UnsupportedOperationException("route:"+key+" is not supported,please check your config");

    }
}

2.3 范围分片算法实践

2.3.1 配置类

在这里插入图片描述

#分片键
spring.shardingsphere.sharding.tables.course.table-strategy.standard.sharding-column=user_id
#分表策略-范围
spring.shardingsphere.sharding.tables.course.table-strategy.standard.range-algorithm-class-name=com.mine.sharding.algorithm.MyRangeTableShardingAlgorithm

2.3.2 自定义算法类

在这里插入图片描述

public class MyRangeTableShardingAlgorithm implements RangeShardingAlgorithm<Long> {

    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Long> rangeShardingValue) {
        Long upperValue = rangeShardingValue.getValueRange().upperEndpoint();
        Long lowerValue = rangeShardingValue.getValueRange().lowerEndpoint();

        String logicTableName = rangeShardingValue.getLogicTableName();
        //course_$->{cid%2}

        return Arrays.asList(logicTableName+"0",logicTableName+"1");
    }
}

2.4 复合分片算法实践

什么是复合,或者是复杂,不再是单一条件了,可以看到,配置类中的sharding-column加s了,不再是单数了
这种复合的分片策略,支持多个分片键,按多个分片键组合出复杂的分片策略

2.4.1 配置类

在这里插入图片描述

#分片键,可多个
spring.shardingsphere.sharding.tables.course.table-strategy.complex.sharding-columns=cid,user_id
#分表策略
spring.shardingsphere.sharding.tables.course.table-strategy.complex.algorithm-class-name=com.mine.sharding.algorithm.MyComplexTableShardingAlgorithm

2.4.2 自定义算法类

在这里插入图片描述

public class MyComplexTableShardingAlgorithm implements ComplexKeysShardingAlgorithm<Long> {

    @Override
    public Collection<String> doSharding(Collection<String> collection, ComplexKeysShardingValue<Long> complexKeysShardingValue) {
        Range<Long> cidRange = complexKeysShardingValue.getColumnNameAndRangeValuesMap().get("cid");
        Collection<Long> userIdCol = complexKeysShardingValue.getColumnNameAndShardingValuesMap().get("user_id");

        Long cidUpper = cidRange.upperEndpoint();
        Long cidLower = cidRange.lowerEndpoint();

        List<String> result = new ArrayList<>();
        for (Long userId : userIdCol) {
            BigInteger userIdB = BigInteger.valueOf(userId);
            BigInteger target = userIdB.mod(new BigInteger("2"));
            result.add(complexKeysShardingValue.getLogicTableName()+target);
        }
        return result;
    }
}

2.5 Hint分片算法(强制路由)实践

2.5.1 配置类

配置文件中,没有指定分片键,为什么呢,大家可以看名字,强制路由,强制了,我也就没必要再预先设置一个分片键了,在程序中干预,指定SQL的目标数据库和表信息。

在这里插入图片描述

#Hint在配置中不指定分片键
#分表策略
spring.shardingsphere.sharding.tables.course.table-strategy.hint.algorithm-class-name=com.mine.sharding.algorithm.MyHintTableShardingAlgorithm

2.5.2 自定义算法类

在这里插入图片描述

public class MyHintTableShardingAlgorithm implements HintShardingAlgorithm<Integer> {

    /**
     * Hint限制:
     * 不支持union查询
     * 不支持多层子查询
     * 不支持函数计算
     */

    @Override
    public Collection<String> doSharding(Collection<String> collection, HintShardingValue<Integer> hintShardingValue) {

        String key = hintShardingValue.getLogicTableName() + hintShardingValue.getValues().toArray()[0];
        if (collection.contains(key)) {
            return Arrays.asList(key);
        }
        throw new UnsupportedOperationException("route:" + key + " is not supported,please check your config");
    }
}

2.6.3 测试类

Hint算法如何在程序中干预呢,我们写一个简单的测试方法
在这里插入图片描述
我们可以看到,是通过HintManager来指定,很方便
但是也有一点需要注意的地方,这个是线程安全的,用完之后得关掉,不能带到一下个线程里面。
在这里插入图片描述

    /**
     * Hint
     * 强制路由
     */
    @Test
    public void queryCourseLHint() {
        HintManager hintManager = HintManager.getInstance();
        hintManager.addTableShardingValue("course", 0);
        List<Course> courses = courseMapper.selectList(null);
        courses.forEach(System.out::println);
        hintManager.close();

    }

2.6 广播表实践

在所有的数据源里面,做同样的操作,就是说每个数据源都会保存同样的,全量的数据

在这里插入图片描述

spring.shardingsphere.sharding.broadcast-tables=dict

2.7 绑定表实践

对分片键相同的表做关联查询,最主要就是要避免笛卡尔积

在这里插入图片描述

spring.shardingsphere.sharding.binding-tables[0]=user,dict

2.8 读写分离实践

前提,在数据库层面配置好主从库

6.8.1 配置主从库数据源

在这里插入图片描述


2.8.2 配置主从节点读写分离

当然,这里也需要指定主键及生成算法
在这里插入图片描述

#主从配置、读写分离
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=m
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=s

spring.shardingsphere.sharding.tables.student.actual-data-nodes=ds0.student
spring.shardingsphere.sharding.tables.student.key-generator.column=sid
spring.shardingsphere.sharding.tables.student.key-generator.type=SNOWFLAKE


这次的内容到这里就结束了,作者水平有限,文章不足之处敬请指出

Best Regards

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

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

相关文章

机器人中的数值优化(六)—— 线搜索最速下降法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

C语言每日一练--Day(16)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;寻找奇数 峰值 二分查找 &#x1f493;博主csdn个人主页&#xff1a;小…

《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存

《数字图像处理-OpenCV/Python》连载&#xff08;4&#xff09;图像的读取与保存 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为了方…

【MyBatisⅡ】动态 SQL

目录 &#x1f392;1 if 标签 &#x1fad6;2 trim 标签 &#x1f460;3 where 标签 &#x1f9ba;4 set 标签 &#x1f3a8;5 foreach 标签 动态 sql 是Mybatis的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 在 xml 里面写判断条件。 动态SQL 在数据库里…

vr智慧党建主题展厅赋予企业数字化内涵

现如今&#xff0c;VR全景技术的发展让我们动动手指就能在线上参观博物馆、纪念馆&#xff0c;不仅不用受时间和空间的限制&#xff0c;还能拥有身临其境般的体验&#xff0c;使得我们足不出户就能随时随地学习、传承红色文化。 很多党建展厅都是比较传统的&#xff0c;没有运用…

多级缓存 架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;多次遇到一个很重要的面试题&#xff1a; 20w的QPS的场景下&#xff0c;服务端架构应如何设计&#xff1f;10w的QPS…

国际版阿里云/腾讯云:弹性高性能计算E-HPC入门概述

入门概述 本文介绍E-HPC的运用流程&#xff0c;帮助您快速上手运用弹性高性能核算。 下文以创立集群&#xff0c;在集群中安装GROMACS软件并运转水分子算例进行高性能核算为例&#xff0c;介绍弹性高性能核算的运用流程&#xff0c;帮助您快速上手运用弹性高性能核算。运用流程…

企业架构LNMP学习笔记7

PHP介绍&#xff1a; HTML&#xff1a;超文本标记语言 http: 超文本传输协议 端口80 浏览器将html代码解析成web页面。 PHP&#xff1a;超文本预处理器。后端语言开发&#xff0c;页面上需要动态改变修改的&#xff0c;需要连接数据库查询数据&#xff0c;转为html。 主要…

电脑每次开机杀毒软件报iusb3mon.exe病毒已清除,电脑中病毒iusbmon杀毒办法,工具杀毒

不知道什么时候开始&#xff0c;我电脑C盘的系统数据存储文件夹programdata 不知不觉就没了&#xff0c;找不到了 programdata文件夹为存储系统数据文件的&#xff0c;这个文件不见了&#xff0c;而且我打开了显示隐藏文件和文件夹还是没有显示 然后我重启电脑&#xff0c;杀毒…

万物流动 万物永驻 ——C++ Core Guidelines的流动哲学

众所周知&#xff0c;C 是一门自由的语言&#xff0c;语言的设计哲学之一就是赋予程序员极大的自由度和灵活性&#xff0c;因此&#xff0c;使用C 完成一个任务时&#xff0c;不同的程序员往往会有不同的实现方法&#xff0c;这真正阐释了什么叫条条大路通罗马。不过&#xff0…

CSS transition 过渡

1 前言 CSS过渡(transition)可以在一个元素切换到另一种状态时为其定义平滑的过渡效果。 例如&#xff0c;用户鼠标悬停在按钮上时&#xff0c;按钮颜色平滑的从一个颜色过渡到另一个颜色。 .btn:hover{background-color: red;color: black; }默认悬停效果 添加过渡效果 .b…

电商项目part10 高并发缓存实战

缓存的数据一致性 只要使用到缓存&#xff0c;无论是本地内存做缓存还是使用 redis 做缓存&#xff0c;那么就会存在数据同步的问题。 先读缓存数据&#xff0c;缓存数据有&#xff0c;则立即返回结果&#xff1b;如果没有数据&#xff0c;则从数据库读数据&#xff0c;并且把…

MusicBrainz Picard for Mac :音乐文件ID3编辑器

MusicBrainz Picard for Mac是一款macOS平台的音乐文件ID3编辑器&#xff0c;能够帮助我们在Mac电脑上编辑音乐文件的ID3标签信息&#xff0c;包括艺人、专辑等信息&#xff0c;非常快速和简单方便。Picard是下一代MusicBrainz标记应用程序。 这个新的标签概念是面向专辑的&…

自动化测试(四):pytest结合allure生成测试报告

Allure 报告框架的名称 allure&#xff1a; noun [ U ] 诱惑;魅力;吸引力 文章目录 1. allure下载2. pytest框架使用allure3. 生成allure报告 1. allure下载 下载前需要先安装JDK&#xff0c;这里可以参考自动化测试(二)。 Allure下载路径&#xff1a;https://github.com/allu…

C语言——函数的使用

无参无返回值 语法格式如下&#xff1a; // 函数定义 void 函数名() {函数体 }// 函数调用 函数名();函数名是标识符的一种&#xff0c;需要遵循规则函数只需要定义一次&#xff0c;反复调用只定义函数, 不调用函数, 函数永远不会被执行案例需求&#xff1a; 编写一个函数&am…

视频动态壁纸 Dynamic Wallpaper for Mac中文

Dynamic Wallpaper是一款Mac平台上的动态壁纸应用程序&#xff0c;它可以根据时间等因素动态切换壁纸&#xff0c;提供更加生动和多样化的桌面体验。 Dynamic Wallpaper包含了多个动态壁纸&#xff0c;用户可以根据自己的喜好选择和切换。这些动态壁纸可以根据时间等因素进行自…

VBA技术资料MF51:VBA_在Excel中突出显示唯一值

【分享成果&#xff0c;随喜正能量】世间万物&#xff0c;因果循环不休&#xff0c;你的善心善行&#xff0c;都可能成为你的善缘善果。每天忆佛念佛&#xff0c;每天都在佛菩萨的加持下生活&#xff0c;自然吉祥如意&#xff0c;法喜充满。 。 我给VBA的定义&#xff1a;VBA是…

iPhone 14 Plus与iPhone 14 Pro:你应该买哪一款

又到了iPhone季,这意味着你可能会在几种不同的机型之间左右为难,无法决定买哪一款。更令人困惑的是,苹果推出的iPhone变体——iPhone 14 Plus,只比老款iPhone 14 Pro低100美元。 有这么多选择,你可能想知道哪款iPhone最适合你。你应该买一部大屏幕的iPhone 14 Plus并节省…

164到网络安全面试大全(附答案)

最近有不少小伙伴跑来咨询&#xff1a; 想找网络安全工作&#xff0c;应该要怎么进行技术面试准备&#xff1f;工作不到 2 年&#xff0c;想跳槽看下机会&#xff0c;有没有相关的面试题呢&#xff1f; 为了更好地帮助大家高薪就业&#xff0c;今天就给大家分享两份网络安全工…

pytorch中nn.Conv1d功能介绍

在使用Conv1d函数时&#xff0c;pytorch默认你的数据是一维的&#xff0c;比如一句话“深度学习”可以用一个一维数组 [深, 度, 学, 习] 表示&#xff0c;这个数据就是一维的。图片是二维数据&#xff0c;它有长宽两个维度。 因此在使用 Conv1d 函数时&#xff0c;输入是一个三…