老大批评我不要为了“分库分表”而“分库分表”

【干货】分库分表最佳实践 何时分库分表 MySQL单表(innoDB)可以存储10亿级数据,只是这时候性能比较差,业界公认MySQL单表容量在1KW以下是最佳状态,因为这时它的BTREE索引树高在3~5之间。 参考阿里开发手册建议: 1.单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表;如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。 2.实际情况受mysql机器配置等多方面影响,可能数据量很大但性能依旧不错,但考虑后续发展一定要进行分库分表考虑。 如何分库分表 设置合适的分片 阅读详情


来自:rrd.me/gEJnq

当数据库的数据量过大,大到一定的程度,我们就可以进行分库分表。那么基于什么原则,什么方法进行拆分,这就是本篇所要讲的。

数据库瓶颈

不管是 IO 瓶颈还是 CPU 瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载的活跃连接数的阈值。

在业务 Service 来看, 就是可用数据库连接少甚至无连接可用,接下来就可以想象了(并发量、吞吐量、崩溃)。

IO 瓶颈:

  • 第一种:磁盘读 IO 瓶颈,热点数据太多,数据库缓存放不下,每次查询会产生大量的 IO,降低查询速度→分库和垂直分表。

  • 第二种:网络 IO 瓶颈,请求的数据太多,网络带宽不够→分库。

CPU 瓶颈:

  • 第一种:SQL 问题:如 SQL 中包含 join,group by,order by,非索引字段条件查询等,增加 CPU 运算的操作→SQL 优化,建立合适的索引,在业务 Service 层进行业务计算。

  • 第二种:单表数据量太大,查询时扫描的行太多,SQL 效率低,增加 CPU 运算的操作→水平分表。

分库分表

水平分库

概念:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。

结果:

  • 每个库的结构都一样

  • 每个库中的数据不一样,没有交集

  • 所有库的数据并集是全量数据

场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库的情况下。

分析:库多了,IO 和 CPU 的压力自然可以成倍缓解。

水平分表

概念:以字段为依据,按照一定策略(hash、range 等),讲一个表中的数据拆分到多个表中。

结果:

  • 每个表的结构都一样。

  • 每个表的数据不一样,没有交集,所有表的并集是全量数据。

场景:系统绝对并发量没有上来,只是单表的数据量太多,影响了 SQL 效率,加重了 CPU 负担,以至于成为瓶颈,可以考虑水平分表。

分析:单表的数据量少了,单次执行 SQL 执行效率高了,自然减轻了 CPU 的负担。

垂直分库

概念:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。

结果:

  • 每个库的结构都不一样。

  • 每个库的数据也不一样,没有交集。

  • 所有库的并集是全量数据。

场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块的情况下。

分析:到这一步,基本上就可以服务化了。例如:随着业务的发展,一些公用的配置表、字典表等越来越多,这时可以将这些表拆到单独的库中,甚至可以服务化。

再者,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。

垂直分表

概念:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表中(主表和扩展表)。

结果:

  • 每个表的结构不一样。

  • 每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键,用于关联数据。

  • 所有表的并集是全量数据。

场景:系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大,以至于数据库缓存的数据行减少,查询时回去读磁盘数据产生大量随机读 IO,产生 IO 瓶颈。

分析:可以用列表页和详情页来帮助理解。垂直分表的拆分原则是将热点数据(可能经常会查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表,这样更多的热点数据就能被缓存下来,进而减少了随机读 IO。

拆了之后,要想获取全部数据就需要关联两个表来取数据。但记住千万别用 Join,因为 Join 不仅会增加 CPU 负担并且会将两个表耦合在一起(必须在一个数据库实例上)。

关联数据应该在 Service 层进行,分别获取主表和扩展表的数据,然后用关联字段关联得到全部数据。

分库分表工具

常用的分库分表工具如下:

  • Sharding-JDBC(当当)

  • TSharding(蘑菇街)

  • Atlas(奇虎 360)

  • Cobar(阿里巴巴)

  • MyCAT(基于 Cobar)

  • Oceanus(58 同城)

  • Vitess(谷歌)各种工具的利弊自查

分库分表带来的问题

分库分表能有效缓解单机和单表带来的性能瓶颈和压力,突破网络 IO、硬件资源、连接数的瓶颈,同时也带来一些问题,下面将描述这些问题和解决思路。

事务一致性问题

①分布式事务

当更新内容同时存在于不同库找那个,不可避免会带来跨库事务问题。跨分片事务也是分布式事务,没有简单的方案,一般可使用“XA 协议”和“两阶段提交”处理。

分布式事务能最大限度保证了数据库操作的原子性。但在提交事务时需要协调多个节点,推后了提交事务的时间点,延长了事务的执行时间,导致事务在访问共享资源时发生冲突或死锁的概率增高。

随着数据库节点的增多,这种趋势会越来越严重,从而成为系统在数据库层面上水平扩展的枷锁。

②最终一致性

对于那些性能要求很高,但对一致性要求不高的系统,往往不苛求系统的实时一致性,只要在允许的时间段内达到最终一致性即可,可采用事务补偿的方式。

与事务在执行中发生错误立刻回滚的方式不同,事务补偿是一种事后检查补救的措施,一些常见的实现方法有:对数据进行对账检查,基于日志进行对比,定期同标准数据来源进行同步等。

跨节点关联查询 Join 问题

切分之前,系统中很多列表和详情表的数据可以通过 Join 来完成,但是切分之后,数据可能分布在不同的节点上,此时 Join 带来的问题就比较麻烦了,考虑到性能,尽量避免使用 Join 查询。

解决的一些方法:

①全局表

全局表,也可看做“数据字典表”,就是系统中所有模块都可能依赖的一些表,为了避免库 Join 查询,可以将这类表在每个数据库中都保存一份。这些数据通常很少修改,所以不必担心一致性的问题。

②字段冗余

一种典型的反范式设计,利用空间换时间,为了性能而避免 Join 查询。

例如,订单表在保存 userId 的时候,也将 userName 也冗余的保存一份,这样查询订单详情顺表就可以查到用户名 userName,就不用查询买家 user 表了。

但这种方法适用场景也有限,比较适用依赖字段比较少的情况,而冗余字段的一致性也较难保证。

③数据组装

在系统 Service 业务层面,分两次查询,第一次查询的结果集找出关联的数据 id,然后根据 id 发起器二次请求得到关联数据,最后将获得的结果进行字段组装。这是比较常用的方法。

④ER 分片

关系型数据库中,如果已经确定了表之间的关联关系(如订单表和订单详情表),并且将那些存在关联关系的表记录存放在同一个分片上,那么就能较好地避免跨分片 Join 的问题。

可以在一个分片内进行 Join,在 1:1 或 1:n 的情况下,通常按照主表的 ID 进行主键切分。

跨节点分页、排序、函数问题

跨节点多库进行查询时,会出现 limit 分页、order by 排序等问题。

分页需要按照指定字段进行排序,当排序字段就是分页字段时,通过分片规则就比较容易定位到指定的分片;当排序字段非分片字段时,就变得比较复杂。

需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序。

最终返回给用户如下图:

上图只是取第一页的数据,对性能影响还不是很大。但是如果取得页数很大,情况就变得复杂的多。

因为各分片节点中的数据可能是随机的,为了排序的准确性,需要将所有节点的前N页数据都排序好做合并,最后再进行整体排序,这样的操作很耗费 CPU 和内存资源,所以页数越大,系统性能就会越差。

在使用 Max、Min、Sum、Count 之类的函数进行计算的时候,也需要先在每个分片上执行相应的函数,然后将各个分片的结果集进行汇总再次计算。

全局主键避重问题

在分库分表环境中,由于表中数据同时存在不同数据库中,主键值平时使用的自增长将无用武之地,某个分区数据库自生成 ID 无法保证全局唯一。

因此需要单独设计全局主键,避免跨库主键重复问题。这里有一些策略:

①UUID

UUID 标准形式是 32 个 16 进制数字,分为 5 段,形式是 8-4-4-4-12 的 36 个字符。

UUID 是最简单的方案,本地生成,性能高,没有网络耗时,但是缺点明显,占用存储空间多。

另外作为主键建立索引和基于索引进行查询都存在性能问题,尤其是 InnoDb 引擎下,UUID 的无序性会导致索引位置频繁变动,导致分页。

②结合数据库维护主键 ID 表

在数据库中建立 sequence 表:

CREATE TABLE `sequence` (  
  `id` bigint(20) unsigned NOT NULL auto_increment,  
  `stub` char(1) NOT NULL default '',  
  PRIMARY KEY  (`id`),  
  UNIQUE KEY `stub` (`stub`)  
) ENGINE=MyISAM;

stub 字段设置为唯一索引,同一 stub 值在 sequence 表中只有一条记录,可以同时为多张表生辰全局 ID。

使用 MyISAM 引擎而不是 InnoDb,已获得更高的性能。MyISAM 使用的是表锁,对表的读写是串行的,所以不用担心并发时两次读取同一个 ID。

当需要全局唯一的 ID 时,执行:

REPLACE INTO sequence (stub) VALUES ('a');  
SELECT LAST_INSERT_ID();  

此方案较为简单,但缺点较为明显:存在单点问题,强依赖 DB,当 DB 异常时,整个系统不可用。配置主从可以增加可用性。另外性能瓶颈限制在单台 MySQL 的读写性能。

另有一种主键生成策略,类似 sequence 表方案,更好的解决了单点和性能瓶颈问题。

这一方案的整体思想是:建立 2 个以上的全局 ID 生成的服务器,每个服务器上只部署一个数据库,每个库有一张 sequence 表用于记录当前全局 ID。

表中增长的步长是库的数量,起始值依次错开,这样就能将 ID 的生成散列到各个数据库上。

这种方案将生成 ID 的压力均匀分布在两台机器上,同时提供了系统容错,第一台出现了错误,可以自动切换到第二台获取 ID。

但有几个缺点:系统添加机器,水平扩展较复杂;每次获取 ID 都要读取一次 DB,DB 的压力还是很大,只能通过堆机器来提升性能。

③Snowflake 分布式自增 ID 算法

Twitter 的 Snowfalke 算法解决了分布式系统生成全局 ID 的需求,生成 64 位 Long 型数字。

组成部分如下:

  • 第一位未使用。

  • 接下来的 41 位是毫秒级时间,41 位的长度可以表示 69 年的时间。

  • 5 位 datacenterId,5 位 workerId。10 位长度最多支持部署 1024 个节点。

  • 最后 12 位是毫秒内计数,12 位的计数顺序号支持每个节点每毫秒产生 4096 个 ID 序列。

数据迁移、扩容问题

当业务高速发展、面临性能和存储瓶颈时,才会考虑分片设计,此时就不可避免的需要考虑历史数据的迁移问题。

一般做法是先读出历史数据,然后按照指定的分片规则再将数据写入到各分片节点中。

此外还需要根据当前的数据量个 QPS,以及业务发展速度,进行容量规划,推算出大概需要多少分片(一般建议单个分片的单表数据量不超过 1000W)。

什么时候考虑分库分表

①能不分就不分

并不是所有表都需要切分,主要还是看数据的增长速度。切分后在某种程度上提升了业务的复杂程度。不到万不得已不要轻易使用分库分表这个“大招”,避免“过度设计”和“过早优化”。

分库分表之前,先尽力做力所能及的优化:升级硬件、升级网络、读写分离、索引优化等。当数据量达到单表瓶颈后,在考虑分库分表。

②数据量过大,正常运维影响业务访问

这里的运维是指:

  • 对数据库备份,如果单表太大,备份时需要大量的磁盘 IO 和网络 IO。

  • 对一个很大的表做 DDL,MySQL会锁住整个表,这个时间会很长,这段时间业务不能访问此表,影响很大。

  • 大表经常访问和更新,就更有可能出现锁等待。

③随着业务发展,需要对某些字段垂直拆分

这里就不举例了,在实际业务中都可能会碰到,有些不经常访问或者更新频率低的字段应该从大表中分离出去。

④数据量快速增长

随着业务的快速发展,单表中的数据量会持续增长,当性能接近瓶颈时,就需要考虑水平切分,做分库分表了。

推荐阅读花30分钟,用Jenkins部署码云上的SpringBoot项目就几条命令,一键学会Docker部署SpringBoot项目我们已经不用AOP做操作日志了!小白教程,Springboot项目搭建(前端到数据库,超详细)你这代码写得真丑,满屏的try-catch,全局异常处理不会吗?从一个程序员的角度告诉你:“12306”有多牛逼?好文!必须点赞
MySQL分库分表策略详解:从理论到实践的最佳方案 分库分表是应对海量数据的高阶解决方案,需要根据业务特点选择合适策略。理想的架构应该:满足未来3-5年的业务增长保持合理的复杂度预留扩展空间具备完善的监控体系记住:没有完美的分片方案,只有最适合业务现状的权衡选择。希望本文能为您的分库分表实践提供全面指导。 阅读详情

相关推荐

CUDA详细安装及环境配置——环境配置指南 – CUDA+cuDNN+PyTorch 安装

本文详细介绍了如何确定显卡支持的CUDA版本、选择对应的cuDNN版本,并逐步安装CUDA、cuDNN和PyTorch。首先,通过命令行输入nvidia-smi.exe查看显卡支持的CUDA版本。接着,根据CUDA版本选择对应的cuDNN版本并下载。然后,从NVIDIA官方网站下载CUDA安装包,按照提示进行安装,并检查是否安装成功。同样地,下载cuDNN安装包,解压后将文件拷贝到CUDA安装目录中,并通过命令行验证安装是否成功。最后,根据PyTorch官网的指引,选择合适的安装命令进行PyTorch的安装

2501_90350274的博客 5098

大规模IM用户数据分库分表之二叉树分库分表

互联网发展带来来了数据量巨增,单数据无法解决,导致出现了数据库分库和分表,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。但是分库和分表带来的问题是业务数据的一致性,线性可扩展性,管理的复杂性和容错性带来了很大的挑战。 数据分库和分表的核心问题是表的ID唯一,然后根据唯一的ID映射到一个物理存储位置。

everlasting_188-java从业者 5120

PLS-PM with R 偏最小二乘路径建模 (R语言)

1. 引入 1.1. 安装plspm包 plspm 是一个用于执行偏最小二乘路径建模分析的 r 程序包。 在 CRAN 上可以免费下载: Http://cran.r-project.org/web/packages/plspm/index.html. 此后,通过以下代码在r中安装并加载该程序包即可。 install.packages("plspm") library("plspm") 2. 一些简单概念 2.1. 潜变量和观测变量 不少变量如满意度、成功指数是无法通过观测得到

Wowlittlemoon的博客 1万+

分库分表最佳实践

最后我们还需要做一步历史数据归档的操作,将 N 个月之前的数据要定期迁移到HBASE之类存储,保证MySQL中的数据一直保持在一个可接受的范围。而归档数据的查询便依赖于大数据提供服务。本次分库分表是一次非常难得的实践操作,网上大部分的资料都是在汽车出厂前就换好了轮胎。而我们大部分碰到的场景都是要对高速路上跑着的车子换胎,一不小心就"车毁人亡"。来源:https://crossoverjie.top/2019/07/24/framework-design/sharding-db-03/

cxclll的博客 252

从零开始:TexLive(Latex)安装与配置全指南

本文提供了一份详尽的TexLive(Latex)安装与配置全指南,旨在帮助用户从零开始快速搭建LaTeX工作环境。内容涵盖从镜像下载、安装步骤详解、环境验证到高效编辑器(如VS Code)配置,并特别强调了中文排版支持与宏包管理,确保用户能顺利处理学术论文等专业文档的排版需求。

weixin_29284885的博客 905

mysql数据库中使用存储过程带来的好处和示例(存储过程的概念、定义、作用等详解)

MySQL的存储过程(Stored Procedure)是一组SQL语句集合。用户通过指定的存储过程名和参数来调用并执行它。存储过程可以在数据库中预编译并存储,这样它们可以被多次调用而无需重新编写或解析SQL语句。 存储过程将复杂的SQL逻辑封装在一个可重用的单元中。多次调用存储过程,而不需要重复编写相同的SQL代码。- 通过封装,可以隐藏复杂的SQL逻辑,只向用户或应用程序提供简单的接口。MySQL的存储过程和编程语言中的函数的原理和目标是一致的:封装可重用的代码逻辑并提高代码的可维护性和可重用性。

weixin_70208651的博客 1719

老大又批评我不要为了“分库分表”而“分库分表”

点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络...

芋艿V 519

SCI、中科院1区算法应用:(BWO-CNN-BiGRU-Attention)白鲸优化深度学习-融合注意力机制预测程序代码!包含特征可视化,数据Excel导入,直接运行!

BWO 白鲸优化算法,于2022年发表在SCI、中科院1区期刊《Knowledge-Based Systems》上。我们利用该高创新算法对我们的CNN-BiGRU-Attention时序和空间特征结合-融合注意力机制的回归预测程序代码中的超参数进行优化。

weixin_48747334的博客 3265

分库分表原理_老大又批评我不要为了“分库分表”而“分库分表”

数据库瓶颈分库分表分库分表工具分库分表带来的问题什么时候考虑分库分表《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot 实现原理与源码解析 —— 精品合集》《数据库实体设计合集》...

weixin_28839439的博客 261

AI+医疗:多模态模型让肺结节诊断准确率突破95%+的实战方案

多模态融合是必由之路:单一影像模型难以突破95%准确率,必须整合临床、生物标志物等多维数据跨模态注意力机制是核心:简单拼接效果差,注意力机制能自动学习各模态权重,提升融合效果临床适配比技术先进更重要:模型输出必须符合医生诊断习惯,提供可解释的决策依据持续学习是长期成功的关键:医疗数据分布不断变化,模型必须具备自适应能力多学科协作是保障:放射科、胸外科、病理科、AI工程师共同参与模型设计与优化。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1024

博途PLC信号处理系列之卡尔曼滤波程序(Kalman Filter)

三菱系列PLC的卡尔曼滤波程序,可以参看下面这篇博文PLC滤波算法之卡尔曼滤波(kalmanFilter)代码+测试_RXXW_Dor的博客-优快云博客_plc滤波kalman滤波是采用递归的方法解决线性滤波问题,只需要当前的测量值input(西门子PLC里比如我们的模拟量通道AIW0值)和前一个采样周期的估计值(上一个时刻的滤波输出结果last_out)就能进行状态估计,需要的存储空间小,每一步的计算量小。下面我们通过程序代码一一给大家展示下。注意。......

RXXW_Dor的博客 3476

单行sql要不要事务_老大批评我不要为了“分库分表”而“分库分表”

来自:http://rrd.me/gEJnq作者:坚持就是胜利当数据库的数据量过大,大到一定的程度,我们就可以进行分库分表。那么基于什么原则,什么方法进行拆分,这就是本篇所要讲的。数据库瓶颈不管是 IO 瓶颈还是 CPU 瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载的活跃连接数的阈值。在业务 Service 来看, 就是可用数据库连接少甚至无连接可用,接下来就可以想象了(...

weixin_39543647的博客 93

使用Python爬虫抓取公共交通网站的时刻表

Python爬虫是一种通过自动化方式从网页中抓取数据的程序。爬虫通过模拟用户请求,获取网站的HTML页面内容,并通过解析这些HTML内容,提取出我们需要的信息。requests:用于向网站发送HTTP请求并获取响应。:用于解析HTML文档,提取数据。Selenium:用于处理动态加载的网页,模拟浏览器操作。pandas:用于数据处理和分析,方便存储和操作抓取到的数据。本文介绍了如何使用Python爬虫抓取公共交通网站的时刻表,并提取其中的关键信息。我们使用了requestsSelenium和。

2201_76125261的博客 1120

华为工作总结

在华为是给中国移动做crm系统和账务系统。 一线是现场的运维和测试。运维主要负责oracle数据库的相关脚本的升级以及二线研发提供的部署包和相关的一些文档。测试是软通公司负责,主要是根据移动的现有业务对升级后的版本进行检验。针对移动公司提出的需求。华为的sa负责进行需求澄清,并将对应的需求与二线开发进行沟通。每个月的迭代版本主要包含之前的遗留bug以及新的业务需求。部署的机器是aix小型机。 Web端框架使用的是web logic。一线需要。编写很多的存储过程来进行一些。数据的处理。比如按月返还一些呃用户

milaier的专栏 189

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

如果MySQL引起CPU消耗过大,你会怎么优化?

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 2.8 分钟。来自:https://www.cnblogs.com/xiaoheliu1024/p/12657929...

良月柒 695

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

我把SpringBoot项目从18.18M瘦身到0.18M,部署起来真省事!

点击上方“方志朋”,选择“设为星标”回复”666“获取新整理的面试文章作者:yjgithub原文:http://suo.im/5OOWQy目录:1.前言2.瘦身前的Jar包3.解决方案...

方志朋的博客 134

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

实现扫码登陆的最简单方案与原理

点击上方“方志朋”,选择“设为星标”回复”666“获取新整理的面试文章来源:http://t.cn/Eogt0kw需求介绍原理解释网页端+服务器手机端+服务器登录成功需求介绍首先,介绍下什...

方志朋的博客 135

多模态大模型技术解析与应用实践指南

多模态大模型作为人工智能领域的重要突破,通过Transformer架构实现了文本、图像、音频等跨模态数据的联合表征学习。其核心技术包括跨模态注意力机制和动态模态路由,显著提升了语义对齐能力与计算效率。在工程实践中,这类模型展现出强大的应用价值,特别在医疗影像分析和电商多模态搜索等场景表现突出。以Emu模型为例,其创新的自回归统一建模方式可减少40%参数量,而LLaVA等开源方案为不同规模部署提供了灵活选择。随着模型规模超过100B参数时出现的'多模态相变'现象,以及MoE架构等压缩技术的成熟,这类模型正在加

weixin_34342905的博客 535
上一篇: 分享一套SpringBoot开发博客系统源码,含完整开发文档和视频!速保存!
下一篇: 只需要6个步骤,springboot集成shiro,并完成登录
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值