shadingjdbc实战分表分库

文章目录

          • 一、问题汇总
            • 1. 水平与垂直拆分之间的区别?
            • 2. 单表达到多大量开始进行分库分表?
            • 3. 基于客户端与服务端实现分表分库区别?
            • 4. 数据库分表分库策略有哪些?
            • 5. 自定义范围分表算法实现分表?
          • 二、整合ShardingSphere实现分表
            • 2.1. 依赖
            • 2.2. 配置
            • 2.3. 表结构
            • 2.4. 测试接口
            • 2.5. 实现类
          • 四、测试验证
            • 4.1. 测试增加用户数据到分表中
            • 4.2. 测试根据用户userId查询分表用户数据
            • 4.3. 测试根据用户userId更新分表用户数据
            • 4.4. 测试根据用户userId删除分表用户数据
            • 4.5. 总结归纳

一、问题汇总
1. 水平与垂直拆分之间的区别?

垂直拆分:根据业务实现拆分

微服务架构模式中,会员团队、支付团队、交易团队。有自己独立的数据库,会员db、支付db、交易db,带来的分布式事务问题。

水平拆分:将一张大表的数量拆分n多张不同子表。

  • 第1种:同一库分表

原表:mayikt-member–1500万条

分表:

mayikt-member0–0~500万条

mayikt-member1–500~1000万条

mayikt-member2–1000~1500万条

  • 第2种:多库分表

原表:mayikt-member–1500万条

mayikt-member:

分库分表:

mayikt-memberdb01

mayikt-member --0~500万条

mayikt-memberdb02

mayikt-member --500~1000万条

mayikt-memberdb03

mayikt-member --1000~1500万条

2. 单表达到多大量开始进行分库分表?

单表行数超过500万行或者单标容量超过2GB,才推荐进行分库分表。

说明:如果预计三年后的数据量根据达不到这个级别,请不要在创建表时就分库分表。

3. 基于客户端与服务端实现分表分库区别?
  • 1.基于服务端mycat实现数据库代理
    优点:能够保证数据库的安全性
    缺点:效率比较低

  • 2.基于客户端SHardingjdbc实现数据库代理
    有点:效率比较高
    缺点:不能够保证数据库的安全性,内存溢出

4. 数据库分表分库策略有哪些?

区域/取模(不推荐使用,后期无法进行扩容)
按照范围分片(推荐使用)
按照日期进行分片
按照枚举进行分片
一致性hash分片
按照目标字段前缀制定进行分片

5. 自定义范围分表算法实现分表?
package com.mayikt.api.impl.config;import io.shardingsphere.api.algorithm.sharding.PreciseShardingValue;
import io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm;
import lombok.extern.slf4j.Slf4j;import java.util.Collection;@Slf4j
public class MayiktPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {/*** 真实建议是为500万测试为5条*/private Long tableSize = 5l;/*** 插入数据 改写表的名称* 查询 改写表的名称* @param collection* @param preciseShardingValue* @return*/@Overridepublic String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {Double userId = Double.valueOf(preciseShardingValue.getValue());Double temp = userId / tableSize;String tableName = "meite_user" + (int) Math.ceil(temp);// 分表分库 userid====mysql自带的自增 序列 雪花算法log.info("<tableName{}>", tableName);return tableName;}
}
二、整合ShardingSphere实现分表
2.1. 依赖
        <!--分表库分表中间件--><dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>3.1.0</version></dependency><dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-jdbc-spring-namespace</artifactId><version>3.1.0</version></dependency>
2.2. 配置
spring:jackson:date-format: yyyy-MM-dd HH:mm:ssprofiles:active: devapplication:###服务的名称name: mayikt-membercloud:nacos:discovery:###nacos注册地址server-addr: 127.0.0.1:8848config:server-addr: 127.0.0.1:8848file-extension: yml#  datasource:#    driver-class-name: com.mysql.cj.jdbc.Driver#    url: jdbc:mysql://localhost:3306/mayikt-member?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8#    username: root#    password: 123456redis:host: 127.0.0.1port: 6379password: 123456logging:level:###打印mybatis日志com.mayikt.api.impl.mapper: debugmain:allow-bean-definition-overriding: true
server:port: 7000
mayikt:userName: mayiktthread:corePoolSize: 10maxPoolSize: 10queueCapacity: 20keepAlive: 60# 数据源 mayiktdb
#按照范围分片
sharding:jdbc:datasource:names: mayikt-member# 第一个数据库mayikt-member:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/mayikt-member?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8username: rootpassword: 123456# 水平拆分的数据库(表) 配置分库 + 分表策略 行表达式分片策略config:sharding:tables:meite_user:actual-data-nodes: mayikt-member.meite_user$->{1..3}table-strategy:standard:### where userIdprecise-algorithm-class-name: com.mayikt.api.impl.config.MayiktPreciseShardingAlgorithmsharding-column: user_id# 打印执行的数据库props:sql:show: true
# 取模配置
## 数据源 mayiktdb
#sharding:
#  jdbc:
#    datasource:
#      names: mayikt-member
#      # 第一个数据库
#      mayikt-member:
#        type: com.zaxxer.hikari.HikariDataSource
#        driver-class-name: com.mysql.cj.jdbc.Driver
#        jdbc-url: jdbc:mysql://127.0.0.1:3306/mayikt-member?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
#        username: root
#        password: 123456
#    # 水平拆分的数据库(表) 配置分库 + 分表策略 行表达式分片策略
#    config:
#      sharding:
#        tables:
#          meite_user:
#            # mayikt-member.meite_user0 mayikt-member.meite_user1 mayikt-member.meite_user2
#            actual-data-nodes: mayikt-member.meite_user$->{0..2}
#            table-strategy:
#              inline:
#                # 根据user_id分表
#                sharding-column: user_id
#                # 分片算法表达式 meite_user——1%3 meite_user_2% 3  meite_user_3% 3
#                algorithm-expression: meite_user$->{user_id % 3}
#      # 打印执行的数据库
#      props:
#        sql:
#          show: true
2.3. 表结构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for meite_user
-- ----------------------------
DROP TABLE IF EXISTS `meite_user`;
CREATE TABLE `meite_user`  (`USER_ID` int NOT NULL AUTO_INCREMENT COMMENT 'USER_ID',`MOBILE` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',`PASSWORD` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',`USER_NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',`SEX` tinyint(1) NULL DEFAULT 0 COMMENT '性别 1-男 2-女',`AGE` tinyint NULL DEFAULT 0 COMMENT '年龄',`CREATE_TIME` timestamp NULL DEFAULT NULL COMMENT '注册时间',`IS_AVALIBLE` tinyint(1) NULL DEFAULT 1 COMMENT '是否可用 1-正常 2-冻结 ',`PIC_IMG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户头像',`QQ_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'QQ联合登陆id',`WX_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信公众号关注id',`VERSION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`IS_DELETE` int NULL DEFAULT NULL,PRIMARY KEY (`USER_ID`) USING BTREE,UNIQUE INDEX `MOBILE_UNIQUE`(`MOBILE`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 87 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户会员表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of meite_user
-- ----------------------------
INSERT INTO `meite_user` VALUES (21, '17610155217', '15A013BCAC0C50049356B322E955035E', '90架构师', 0, 0, NULL, 1, NULL, NULL, 'oD8nF5jpNF9KXU_j49uvqOPVdiEU', NULL, 0);-- ----------------------------
-- Table structure for meite_user0
-- ----------------------------
DROP TABLE IF EXISTS `meite_user0`;
CREATE TABLE `meite_user0`  (`USER_ID` int NOT NULL AUTO_INCREMENT COMMENT 'USER_ID',`MOBILE` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',`PASSWORD` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',`USER_NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',`SEX` tinyint(1) NULL DEFAULT 0 COMMENT '性别 1-男 2-女',`AGE` tinyint NULL DEFAULT 0 COMMENT '年龄',`CREATE_TIME` timestamp NULL DEFAULT NULL COMMENT '注册时间',`IS_AVALIBLE` tinyint(1) NULL DEFAULT 1 COMMENT '是否可用 1-正常 2-冻结 ',`PIC_IMG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户头像',`QQ_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'QQ联合登陆id',`WX_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信公众号关注id',`VERSION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`IS_DELETE` int NULL DEFAULT NULL,PRIMARY KEY (`USER_ID`) USING BTREE,UNIQUE INDEX `MOBILE_UNIQUE`(`MOBILE`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 87 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户会员表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of meite_user0
-- ----------------------------
INSERT INTO `meite_user0` VALUES (12, '17610155217', '15A013BCAC0C50049356B322E955035E', '90架构师12', 0, 0, NULL, 1, NULL, NULL, 'oD8nF5jpNF9KXU_j49uvqOPVdiEU', NULL, 0);-- ----------------------------
-- Table structure for meite_user1
-- ----------------------------
DROP TABLE IF EXISTS `meite_user1`;
CREATE TABLE `meite_user1`  (`USER_ID` int NOT NULL AUTO_INCREMENT COMMENT 'USER_ID',`MOBILE` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',`PASSWORD` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',`USER_NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',`SEX` tinyint(1) NULL DEFAULT 0 COMMENT '性别 1-男 2-女',`AGE` tinyint NULL DEFAULT 0 COMMENT '年龄',`CREATE_TIME` timestamp NULL DEFAULT NULL COMMENT '注册时间',`IS_AVALIBLE` tinyint(1) NULL DEFAULT 1 COMMENT '是否可用 1-正常 2-冻结 ',`PIC_IMG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户头像',`QQ_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'QQ联合登陆id',`WX_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信公众号关注id',`VERSION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`IS_DELETE` int NULL DEFAULT NULL,PRIMARY KEY (`USER_ID`) USING BTREE,UNIQUE INDEX `MOBILE_UNIQUE`(`MOBILE`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 87 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户会员表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of meite_user1
-- ------------------------------ ----------------------------
-- Table structure for meite_user2
-- ----------------------------
DROP TABLE IF EXISTS `meite_user2`;
CREATE TABLE `meite_user2`  (`USER_ID` int NOT NULL COMMENT 'USER_ID',`MOBILE` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',`PASSWORD` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',`USER_NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',`SEX` tinyint(1) NULL DEFAULT 0 COMMENT '性别 1-男 2-女',`AGE` tinyint NULL DEFAULT 0 COMMENT '年龄',`CREATE_TIME` timestamp NULL DEFAULT NULL COMMENT '注册时间',`IS_AVALIBLE` tinyint(1) NULL DEFAULT 1 COMMENT '是否可用 1-正常 2-冻结 ',`PIC_IMG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户头像',`QQ_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'QQ联合登陆id',`WX_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信公众号关注id',`VERSION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`IS_DELETE` int NULL DEFAULT NULL,PRIMARY KEY (`USER_ID`) USING BTREE,UNIQUE INDEX `MOBILE_UNIQUE`(`MOBILE`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 87 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户会员表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of meite_user2
-- ----------------------------
INSERT INTO `meite_user2` VALUES (6, '17610135255', NULL, '90架构师update', 1, 2, '2014-09-05 18:54:16', 1, 'test_45904720d2ea', NULL, NULL, NULL, 0);-- ----------------------------
-- Table structure for meite_user3
-- ----------------------------
DROP TABLE IF EXISTS `meite_user3`;
CREATE TABLE `meite_user3`  (`USER_ID` int NOT NULL AUTO_INCREMENT COMMENT 'USER_ID',`MOBILE` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',`PASSWORD` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',`USER_NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',`SEX` tinyint(1) NULL DEFAULT 0 COMMENT '性别 1-男 2-女',`AGE` tinyint NULL DEFAULT 0 COMMENT '年龄',`CREATE_TIME` timestamp NULL DEFAULT NULL COMMENT '注册时间',`IS_AVALIBLE` tinyint(1) NULL DEFAULT 1 COMMENT '是否可用 1-正常 2-冻结 ',`PIC_IMG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户头像',`QQ_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'QQ联合登陆id',`WX_OPEN_ID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信公众号关注id',`VERSION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`IS_DELETE` int NULL DEFAULT NULL,PRIMARY KEY (`USER_ID`) USING BTREE,UNIQUE INDEX `MOBILE_UNIQUE`(`MOBILE`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 87 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户会员表' ROW_FORMAT = Dynamic;
2.4. 测试接口
package com.mayikt.api.member;import com.mayikt.api.base.BaseResponse;
import com.mayikt.api.member.dto.resp.UserInfoDto;
import org.springframework.web.bind.annotation.*;public interface UserInfoService {/*** 根据token获取用户的信息** @param token* @return*/@GetMapping("getUserInfo")BaseResponse<UserInfoDto> getUserInfo(@RequestParam("token") String token);// 分库分表案例接口/*** 测试根据用户userId查询分表用户数据** @param userId* @return*/@GetMapping("testGetSubTableUser")BaseResponse<UserInfoDto> testGetSubTableUser(Long userId);/*** 测试根据用户userId删除分表用户数据** @param userId* @return*/@DeleteMapping("testDelSubTableUser")BaseResponse<String> testDelSubTableUser(Long userId);/*** 测试增加用户数据到分表中** @param userReqDto* @return*/@PostMapping("testInsertSubTableUser")BaseResponse<String> testInsertSubTableUser(@RequestBody UserInfoDto userReqDto);/*** 测试根据用户userId更新分表用户数据** @param userReqDto* @return*/@PutMapping("testUpdateSubTableUser")BaseResponse<String> testUpdateSubTableUser(@RequestBody UserInfoDto userReqDto);
}
2.5. 实现类
package com.mayikt.api.impl.member;import com.mayikt.api.base.BaseApiService;
import com.mayikt.api.base.BaseResponse;
import com.mayikt.api.impl.entity.UserInfoDo;
import com.mayikt.api.impl.mapper.UserInfoMapper;
import com.mayikt.api.member.UserInfoService;
import com.mayikt.api.member.dto.resp.UserInfoDto;
import com.mayikt.api.utils.DesensitizationUtil;
import com.mayikt.api.utils.TokenUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserInfoServiceImpl extends BaseApiService implements UserInfoService {@Autowiredprivate UserInfoMapper userInfoMapper;@Autowiredprivate TokenUtils tokenUtils;@Overridepublic BaseResponse<UserInfoDto> getUserInfo(String token) {if (StringUtils.isEmpty(token)) {return setResultError("token 不能为空!");}// 2.根据token查询 Redis 获取用户的useridString tokenValue = tokenUtils.getTokenValue(token);if (StringUtils.isEmpty(tokenValue)) {return setResultError("token 可能失效!");}Long userId = Long.parseLong(tokenValue);// 3.根据用户的userid 查询用户信息UserInfoDo userInfoDo = userInfoMapper.selectById(userId);if (userInfoDo == null) {return setResultError("token错误!");}UserInfoDto userInfoDto = doToDto(userInfoDo, UserInfoDto.class);userInfoDto.setMobile(DesensitizationUtil.mobileEncrypt(userInfoDto.getMobile()));return setResultSuccess(userInfoDto);}/*** 测试根据用户userId查询分表用户数据** @param userId* @return*/@Overridepublic BaseResponse<UserInfoDto> testGetSubTableUser(Long userId) {UserInfoDo userInfoDo = userInfoMapper.selectById(userId);UserInfoDto userInfoDto = doToDto(userInfoDo, UserInfoDto.class);return setResultSuccess(userInfoDto);}/*** 测试根据用户userId删除分表用户数据** @param userId* @return*/@Overridepublic BaseResponse<String> testDelSubTableUser(Long userId) {int result = userInfoMapper.deleteById(userId);if (result <= 0) {return setResultError("删除userId->" + userId + "失败");}return setResultSuccess("删除userId->" + userId + "成功");}/*** 测试增加用户数据到分表中** @param userInfoDto* @return*/@Overridepublic BaseResponse<String> testInsertSubTableUser(UserInfoDto userInfoDto) {UserInfoDo userInfoDo = new UserInfoDo();BeanUtils.copyProperties(userInfoDto, userInfoDo);int result = userInfoMapper.insert(userInfoDo);if (result <= 0) {return setResultError("新增数据失败");}return setResultSuccess("新增数据成功");}/*** 测试根据用户userId更新分表用户数据** @param userInfoDto* @return*/@Overridepublic BaseResponse<String> testUpdateSubTableUser(UserInfoDto userInfoDto) {UserInfoDo userInfoDo = new UserInfoDo();BeanUtils.copyProperties(userInfoDto, userInfoDo);int result = userInfoMapper.updateById(userInfoDo);if (result <= 0) {return setResultError("更新数据失败");}return setResultSuccess("更新数据成功");}}
四、测试验证
4.1. 测试增加用户数据到分表中

在这里插入图片描述

http://localhost:7000/testInsertSubTableUser
{"userId": 6,"mobile": "17610135255","userName": "90架构师","sex": "0","age": 5,"createTime": "2014-09-05 18:54:16","isAvalible": "1","picImg": "test_45904720d2ea"
}
4.2. 测试根据用户userId查询分表用户数据
http://localhost:7000/testGetSubTableUser?userId=6

在这里插入图片描述

4.3. 测试根据用户userId更新分表用户数据
http://localhost:7000/testUpdateSubTableUser
{"userId": 6,"mobile": "17610135255","userName": "90架构师update","sex": "1","age": 2,"createTime": "2014-09-05 18:54:16","isAvalible": "1","picImg": "test_45904720d2ea"
}

在这里插入图片描述

4.4. 测试根据用户userId删除分表用户数据
http://localhost:7000/testDelSubTableUser?userId=6

在这里插入图片描述

4.5. 总结归纳

shadingjdbc 原理:通过增删改查sql进行aop拦截,将表名根据算法策略进行替换。

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

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

相关文章

阿里云机器学习怎么玩?这本新手入门指南揭秘了!

想知道我是怎样免费在阿里云上玩机器学习的吗&#xff1f; 不慌&#xff0c;这就告诉你答案~ 它来了--阿里云向个人免费开放云端深度学习开发环境DSW&#xff08;DataScienceWorkshop&#xff09;&#xff0c;还有免费GPU资源可以使用&#xff0c;实验的数据还会免费保存30天&a…

华为庞鑫:闪存3.0时代,四大变化激发全闪存数据中心潜能释放

从2005年到2019年间&#xff0c;中国数字经济总体规模由2.6万亿元增加至35.8万亿元&#xff0c;数字经济在GDP的占比也由14.2%提升至36.2%。随着数字经济蓬勃发展&#xff0c;数据也成为当之无愧的关键生产要素&#xff0c;是基础性资源和战略性资源。数据洪流的到来进一步驱动…

基于RabbitMQ订单未支付30分钟自动取消

文章目录一、原理实现1. 超时消费流程图2. 死信队列的架构原理3. 订单超时30分钟实现原理二、核心代码实战2.1. 记录订单待支付数据2.2. 超时消费者监听2.3. 订单核对校验一、原理实现 1. 超时消费流程图 2. 死信队列的架构原理 相同点&#xff1a; 死信队列和普通队列区别不…

蚂蚁mPaaS:有人修建高楼,有人重构城市

简介&#xff1a; 纵览这时代的先声&#xff0c;在高楼之巅&#xff0c;在海天之外。 2018年2月&#xff0c;春运拉开序幕。 这是人类史上最大规模的迁徙活动&#xff0c;3.82亿人坐进车厢&#xff0c;被31万趟车次送往不同的目的地。如果有一台摄影机从高空对准中国大地&…

全场景闪存加速、全场景数据保护,华为助力医院实现智能化转型

数字经济时代的来临&#xff0c;是影响当今医疗健康服务领域最重要的大趋势。在这种大背景下&#xff0c;新时期的智能医疗必将在医疗行业内掀起一阵浪潮。2020年&#xff0c;新冠疫情的肆虐势必推进浪潮的提前到来。 首都医科大学附属北京同仁医院&#xff0c;始建于1886年&a…

从Cloudflare事件,看DNS服务的重要性

简介&#xff1a; 美国时间7月17日&#xff0c;美国知名的网络安全服务提供商Cloudflare&#xff0c;出现了突发网络服务故障。通过这个事件&#xff0c;和大家聊聊关于网络安全稳定的思考&#xff0c;以及稳定、安全的DNS服务的重要性。 7.17事件 美国时间7月17日下午&#…

基于Redis订单未支付30分钟自动取消

文章目录一、原理实现1. 超时消费流程图2. 订单超时30分钟实现原理二、核心代码实战2.1. 记录订单待支付数据2.2. redis配置2.3. 超时消费者监听一、原理实现 1. 超时消费流程图 2. 订单超时30分钟实现原理 ①用户下单之后&#xff0c;投递一个订单号码存放到redis服务端&…

面向 K8s 设计误区

作者 | 姬望来源 | 阿里巴巴中间件头图 | 下载于视觉中国K8s 设计模式Kubernetes 是一个具有普遍意义的容器编排工具&#xff0c;它提供了一套基于容器构建分布式系统的基础依赖&#xff0c;其意义等同于 Linux 在操作系统中的地位&#xff0c;可以认为是分布式的操作系统。自定…

安装docker-compose插件

文章目录一、安装docker-compose插件1. 下载docker-compose插件2. 赋予权限3. 验证一、安装docker-compose插件 1. 下载docker-compose插件 curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/…

突围数字化转型,让特步同比增长24.8%的全渠道中台

简介&#xff1a; 多年前&#xff0c;曾有媒体向丁水波提问&#xff1a;“对于你个人来说&#xff0c;转型过程中最痛苦的部分是什么&#xff1f;”“最关键的是市场意识的转变。耳听为虚眼见为实&#xff0c;做起来给外界看到了&#xff0c;他们才会明白和接受。很多东西得做完…

赠书 | 什么是 Knative?

作者 | 李志伟、游杨来源 | 华章计算机头图 | 下载于视觉中国✎ 导读 什么是Knative&#xff1f;本文将对Knative的产生背景及发展历程&#xff0c;架构设计&#xff0c;受众群体等做详细介绍。Knative是由谷歌发起&#xff0c;有Pivotal、IBM、Red Hat等公司共同参与开发的Ser…

canal kafka 实现mysql与es/redis 数据同步

文章目录一、原理实现1. 方案设计流程图2. 实现原理二、mysql开启binlog模式2.1. 配置my.ini2.2. 重启mysql服务2.3. 验证binlog模式2.4. 创建canal账号2.5. 账号验证三、docker-compose环境搭建3.1. 环境总览3.2. 编写docker-compose.yml3.3. 安装docker-compose3.4. 构建环境…

免费下载!《阿里工程师的自我修养》公开10位阿里大牛解决问题的思维方式

简介&#xff1a; 今天&#xff0c;阿里技术公布一波阿里P8、P9技术大牛的思维模型&#xff0c;将他们的思维模式呈现出来。你可以在阿里资深专家职业生涯的真切感悟中&#xff0c;找到应对危机的最佳方法。《阿里工程师的自我修养》现已正式公开&#xff0c;可免费下载阅读。 …

云原生时代消息中间件的演进路线

简介&#xff1a; 本文整理自作者于 2020 年云原生微服务大会上的分享《云原生时代的消息中间件演进》&#xff0c;主要探讨了传统的消息中间件如何持续进化为云原生的消息服务。 作者 | 周礼&#xff08;不铭&#xff09; 阿里巴巴集团消息中间件架构师 导读&#xff1a;本文…

四大“化学融合”、两大核心平台能力,华为首次系统解读OneStorage

4月14日&#xff0c;在2021华为全球分析师大会期间&#xff0c;华为举办数据存储专场Session&#xff0c;面向全球分析师全面解读下一代数据存储解决方案OneStorage&#xff0c;引领数据存储产业迈向全场景智能和多云融合。同时&#xff0c;在此期间华为首次向业界系统性地诠释…

科普|不同协议下远程服务器文件上传_下载优劣对比

简介&#xff1a; 作为一个程序员&#xff0c;如果不知道如何进行远程服务器的文件上传与下载&#xff0c;实在是一件尴尬的事情&#xff0c;今天我们聊聊如何实现远程服务器的文件上传与下载。 作为一个程序员&#xff0c;如果不知道如何进行远程服务器的文件上传与下载&#…

Module build failed: Error: Cannot find module ‘gifsicle‘

问题描述&#xff1a; build Cannot find module ‘gifsicle’ 解决方案&#xff1a; 第一步&#xff1a;卸载image-webpack-loader 第1种方式&#xff1a;删除项目中的image-webpack-loader npm uninstall image-webpack-loader第2种方式&#xff1a;删除node_modules中的im…

高德AR驾车导航解决方案

简介&#xff1a; 高德从2018年首创了车载AR导航后&#xff0c;已经先后在后视镜、智能车盒、前装整车厂、后装车机产品、行车记录仪等众多场景落地应用&#xff0c;搭建了非常完整的AR导航生态。 日前&#xff0c;高德地图最新发布了v10.60新版本&#xff0c;上线了手机端的A…

第 11 个“世界备份日”刚过,《Veeam 2021 数据保护报告》为你解读全球数据备份现状

2011 年 3 月 31 日&#xff0c;美国网络社区 Reddit 发起“世界备份日&#xff08;World Backup Day&#xff09;”倡议活动&#xff0c;号召人们做好数据安全备份。于是每年愚人节前一天成为“世界备份日”&#xff0c;口号很有趣 Don’t Be An April Fool,Backup Your Data&…

知乎李大海对话阿里云贾扬清:透视AI应用难题与未来趋势

自AlphaGo接连战胜李世石与柯洁后&#xff0c;越来越多从业者将AI看做科技行业的未来。大大小小的AI公司兴起&#xff0c;国内外巨头公司纷纷加速向AI转型。但经历祛魅后的AI&#xff0c;在过去几年间却并未获得观察者们预想的火箭式爆发。 “AI行业接下来可能有哪些发展&…