谷粒学院项目对应知识点

news2024/11/28 8:41:15

1、数据库分库分表

1.1、业务分库

按照业务模块将数据分散到不同的数据库服务器,比如用户数据、商品数据、订单数据存放在三个不同的数据库服务器中,分散存储和访问压力。但也会带来一些问题:

  • join 操作问题:业务分库后,原本在同一个数据库中的表分散到不同数据库中,导致无法使用 SQL 的 join 查询。
  • 事务问题:原本在同一个数据库中不同的表可以在同一个事务中修改,业务分库后,表分散到不同的数据库中,无法通过事务统一修改。
  • 成本问题:业务分库同时也带来了成本的代价,本来 1 台服务器,现在要 3 台,如果考虑备份,那就是 2 台变成了 6 台。

1.2、主从复制和读写分离:

将数据库读写操作分散到不同的节点上。

  • 数据库服务器搭建主从集群,一主一从、一主多从都可以。
  • 数据库主机负责读写操作,从机只负责读操作。
  • 数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据
  • 业务服务器将写操作发给数据库主机,将读操作发给数据库从机

1.3、数据库分表

单表数据拆分有两种方式:垂直分表和水平分表,用于分散存储压力和提升性能

  • 垂直分表适合将表中某些不常用且占了大量空间的列拆分出去。
  • 水平分表适合表行数特别大的表。

但也会引入复杂性:

水平分表可能存在分布不均匀的问题,一个表中数据非常多,而另一个表中数据非常少。

2、雪花算法:

分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性

  • 长度共64bit(一个long型)。
  • 首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
  • 41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
  • 10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
  • 12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。

 3、MP(MyBatis-Plus)

3.1、主键策略:

MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)

@TableId(type = IdType.ASSIGN_ID)

AUTO主键自增:

@TableId(type = IdType.AUTO)

3.2、自动填充

如插入时间、更新时间的自动填充。添加@TableField

@Data
public class User {

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    //@TableField(fill = FieldFill.UPDATE)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

}

同时也要实现元对象处理器接口:


@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

3.3、乐观锁和悲观锁

悲观锁:假设多个线程会同时访问一个共享资源,并且这些线程会试图修改它。悲观锁的策略是假设最坏情况,即认为在任何时候都有可能有另一个线程来修改这个共享资源,因此在访问前会先锁定这个资源,以防止其他线程修改。悲观锁的典型实现是数据库中的行锁或表锁。

乐观锁:相反,乐观锁的策略是认为多个线程同时访问共享资源的概率很小,因此不需要在访问前锁定资源。相反,每次访问共享资源时,先获取一个版本号或时间戳,并在更新数据时检查这个版本号或时间戳是否被其他线程修改过。如果检查到冲突,则放弃当前操作。乐观锁的典型实现是在Java中使用的CAS(Compare And Swap)操作。

在并发控制的选择上,悲观锁一般会降低并发性,因为它会频繁地加锁和解锁资源,而乐观锁则可以更好地保持并发性,因为它只在冲突发生时才进行回滚操作。但是,乐观锁在并发更新高的情况下容易发生冲突,因为每次更新都需要检查版本号或时间戳,这会增加系统的开销。因此,在实际应用中,应该根据具体情况选择适合的并发控制策略。

Mybatis-Plus项目中,使用乐观锁

  • 数据库中添加version字段
  • 添加 @Version 注解
@Version
private Integer version;

创建配置文件并注册乐观锁插件:

@EnableTransactionManagement
@Configuration
@MapperScan("com.atguigu.mybatis_plus.mapper")
public class MybatisPlusConfig {

    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
}
}

其中:

@EnableTransactionManagement是Spring Framework中的一个注解,用于启用Spring的事务管理功能。

当多个业务操作可能需要同时对多个数据源进行读写操作。如果这些操作不是原子性的,可能会导致数据不一致或错误的结果。为了解决这个问题,应用程序需要使用事务管理来确保一组业务操作被视为单个操作,即要么全部成功,要么全部回滚。

@EnableTransactionManagement注解会启用Spring框架中的事务管理功能,它会基于AOP机制拦截业务层方法调用,自动管理这些方法中的事务,以确保它们被作为一个单独的操作执行。当使用@EnableTransactionManagement注解时,我们需要在Spring配置文件中配置事务管理器、事务拦截器、数据源等相关内容。

3.4分页插件

添加分页插件配置:

@Bean
public PaginationInterceptor paginationInterceptor() {

    return new PaginationInterceptor();

}

使用分页


@Test
public void testSelectPage() {

    Page<User> page = new Page<>(1,5);//第一个参数为当前页,第二个为每页的记录个数
    Page<User> pageParam = userMapper.selectPage(page, null);
    pageParam.getRecords().forEach(System.out::println); //获取当前页记录
    System.out.println(pageParam.getCurrent()); //获取当前页
    System.out.println(pageParam.getPages()); //总页数
    System.out.println(pageParam.getSize()); //记录个数
    System.out.println(pageParam.getTotal()); //总记录
    System.out.println(pageParam.hasNext()); //是否有下一页
    System.out.println(pageParam.hasPrevious()); //是否有上一页

}

返回特定的列:使用结果集Map,例如下学生有姓名、性别、学号、电话、住址等,但是只返回姓名、性别、学号。


@Test
public void testSelectMapsPage() {


    Page<Map<String, Object>> page = new Page<>(1, 5);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();//条件构造器
    queryWrapper.select("name", "age");//选择要返回的列
    Page<Map<String, Object>> pageParam = userMapper.selectMapsPage(page, queryWrapper);
    List<Map<String, Object>> records = pageParam.getRecords();
    records.forEach(System.out::println);
    System.out.println(pageParam.getCurrent());
    System.out.println(pageParam.getPages());
    System.out.println(pageParam.getSize());
    System.out.println(pageParam.getTotal());
    System.out.println(pageParam.hasNext());
    System.out.println(pageParam.hasPrevious());

}

3.5、逻辑删除

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
  • 逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
@TableLogic
private Integer deleted;

4、统一返回结果

创建一个返回码定义枚举类,然后创建结果类

5、统一异常处理,特定异常处理,自定义异常

@ControllerAdvice是Spring Framework中的一个注解,用于定义一个全局的异常处理器


@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class) //用于处理不同类型的异常
    @ResponseBody
    public R error(Exception e){
        e.printStackTrace();
        return R.error();
    }
}

添加特定异常处理,比如http异常


@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseBody
public R error(HttpMessageNotReadableException e){
    e.printStackTrace();
    return R.setResult(ResultCodeEnum.JSON_PARSE_ERROR);
}

自定义异常:创建自定义异常类,继承RuntimeException

@Data
public class GuliException extends RuntimeException {
    //状态码
    private Integer code;

    /**
     * 接受状态码和消息
     * @param code
     * @param message
     */
    public GuliException(Integer code, String message) {
        super(message);
        this.code=code;
    }
    /**
    * 接收枚举类型
     * @param resultCodeEnum
     */
    public GuliException(ResultCodeEnum resultCodeEnum) {
        super(resultCodeEnum.getMessage());
        this.code = resultCodeEnum.getCode();
    }

    
    @Override
    public String toString() {
        return "GuliException{" +
            "code=" + code +
            ", message=" + this.getMessage() +
            '}';
    }
}

添加异常处理方法:


@ExceptionHandler(GuliException.class)
@ResponseBody
public R error(GuliException e){
    log.error(ExceptionUtils.getMessage(e));
    return R.error().message(e.getMessage()).code(e.getCode());
}

在业务中需要的地方抛出这个异常

public R upload(...) {
    try {
        ......
    } catch (Exception e){
        log.error(ExceptionUtils.getMessage(e));
        throw new GuliException(ResultCodeEnum.FILE_UPLOAD_ERROR);
    }
}

6、阿里云存储OSS服务

开通这个服务,会获得相应的keyid,keysecret字段,然后根据官方的技术文档写代码,实现讲师头像的上传和删除。

7、Nacos

  • 引入依赖,
  • 添加配置,将服务注册进Nacos
  • spring:
      application:
        name: service-edu # 服务名
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 # nacos服务地址

  • 客户端启动类添加注解@EnableDiscoveryClient

8、OpenFeign

引入依赖,

启动类添加注解@EnableFeignClients

在OSS Service中实现业务接口,然后再edu服务中通过OpenFeign远程调用,在创建远程调用接口的类上加@FeignClient("service-oss"),并在请求方法中添加对应的请求地址

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

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

相关文章

[qiankun]-多页签缓存

[qiankun]-多页签缓存环境功能需求多页签缓存方案方案1.主服务进行html替换方案2.微服务vnode 替换方案3.每个微服务都不卸载微服务加载方式的选择微服务的路由路径选择微服务的缓存工具微服务的容器使用tab作为微服务的挂载容器使用微服务路由作为微服务的挂载容器场景描述微服…

day18_集合_List

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List 六、ArrayList 七、LinkedList 零、 复习昨日 throw和throws什么区别 throwthrows位置方法…

Word中批量调整图片大小

当一个文档中图片较多&#xff0c;又需要调整图片大小时&#xff0c;这时可以通过“宏”执行代码来批量调整。打开一个Word文档。“AltF8"键打开宏。设置“宏名”&#xff0c;并单击“创建”。创建完宏后&#xff0c;将进入Visual Basic 编辑器界面。在代码编辑区全选&…

WebDAV之π-Disk派盘+文件管理器

文件管理器 支持WebDAV方式连接π-Disk派盘。 推荐一款iOS上的免费文件管理器新秀。 文件管理器这是一款功能强大的文件管理工具,支持zip,rar,7z等压缩包的解压和压缩,支持小说,漫画,视频下载及播,极大提升日常办公,娱乐,文件管理的工作效率,使得文档的归档和管理随心…

Android system实战 — Android R(11) 进程保活白名单

Android system实战 — Android R 进程保活白名单0. 前言1. 具体实现1.1 准备工作1.2 源码实现1.2.1 源码1.2.2 diff文件0. 前言 最近在Android R上实现一些需求&#xff0c;进行记录一下&#xff0c;关于进程保活的基础知识可以参考Android system — 进程生命周期与ADJ&#…

纯手动搭建hadoop3.x集群记录002_安装hadoop3.x_创建xsync分发工具_配置ssh免密登录---大数据之Hadoop3.x工作笔记0164

1.首先我有 172.19.126.117 母机 对应 172.19.126.122 虚拟机 172.19.126.116 母机 对应 172.19.126.121 虚拟机 172.19.126.115 母机 对应 172.19.126.120 虚拟机 对吧,然后我们从115上 开始安装hadoop 2. 然后走到这个opt/software文件夹中,然后解压 hadoop-3.1.3.tar.…

nn.Dropout随机丢神经元的用法

前言&#xff1a; pytorch与tensorflow中均有nn.dropout,两者之间的使用方法&#xff0c;下面将介绍。 一、torch.nn.dropout 说明文档&#xff1a; r"""During training, randomly zeroes some of the elements of the input tensor with probability :att…

人员行为识别系统 TensorFlow

人员行为识别系统人员行为识别系统通过TensorFlow深度学习技术&#xff0c;人员行为识别算法对画面中区域人员不按要求穿戴、违规抽烟打电话、睡岗离岗以及作业流程不规范实时分析预警&#xff0c;发现违规行为立即抓拍告警。深度学习应用到实际问题中&#xff0c;一个非常棘手…

2.22 位运算

位运算 预备知识 首先注意二进制位数从0开始记录&#xff0c;即 15&#xff08;1111&#xff09;&#xff0c;位数分别为3210 左移和右移 左移 << 将某个数的二进制向左移动几位&#xff0c;低位补0 如5>>2 即20&#xff0c;左移k位即相当于乘上2的k次方 右移 >…

C++学习笔记-数组

所谓数组&#xff0c;就是相同数据类型的元素按一定顺序排列的集合&#xff0c;就是把有限个类型相同的变量用一个名字命名&#xff0c;然后用编号区分他们的变量的集合&#xff0c;这个名字称为数组名&#xff0c;编号称为下标。组成数组的各个变量称为数组的分量&#xff0c;…

[面向小白]一篇博客带你认识什么是栈以及如何手撕一个栈

目录 0.前言 1.什么是栈 2.实现栈所选择的基本结构 3.认识栈的小练习 4. 用代码实现一个栈 4.1 用什么可以描述出一个栈 4.2栈接口的设计原则 4.3栈的初始化 4.4栈的插入 4.5 栈的删除 4.6 栈的判空 4.7栈的有效元素的数量 4.8取出栈顶元素 4.9栈的销毁 5. 对实…

BUUCTF-[ACTF新生赛2020]Splendid_MineCraft

题目下载&#xff1a;下载 这道题涉及SMC&#xff0c;动静态调试。 查壳&#xff0c;无壳32位&#xff0c;载入IDA 进入主函数main&#xff1a; 从上面可以看出&#xff0c;flag长度为26&#xff0c;前五个是ACTF{&#xff0c;最后一位是}。 strtok()函数用法&#xff1a;st…

sso单点登录

文章目录 目录 文章目录 前言 一、sso结构实现 二、使用步骤 2.1 建一个spring cloud 项目 2.2 common下的core的配置 2.3 实现系统的业务微服务 2.4 sso模块的编写 总结 前言 单点登录(SingleSignOn&#xff0c;SSO)&#xff0c;就是通过用户的一次性鉴别登录。当用户在身份…

复习知识点三:做人不能半途而废,就算躺平也要躺最舒服的那张床

目录 运算符​编辑 键盘录入: 练习:键盘输入数字并求和 练习: 算术运算符 隐式转换(自动类型提升) 强制转换 练习1: 字符串的 "" 操作 ​编辑 练习 1: 练习2: 练习3: 自增自减运算符 赋值运算符 关系运算符(比较运算符)的分类 练习: 逻辑运算符 短路逻辑运…

电商平台销量查询:2023年1月牛奶乳品热门排行榜

随着人们消费能力的提升以及健康意识的增强&#xff0c;牛奶乳品已经成为居民日常饮食中的重要组成部分&#xff0c;伴随人们整体消费的增长&#xff0c;牛奶乳品行业也越来越成熟。 今年1月份我国牛奶乳品行业的整体趋势如何呢&#xff1f;结合数据我们一同来分析&#xff01;…

国外博士后待遇情况汇总

许多老师再考虑申请国外博士后的时候会顾虑待遇方面的问题&#xff0c;对此知识人网小编整理关于主要国家博士后待遇情况的汇总。美国&#xff1a;美国机会更多&#xff0c;生活质量更高&#xff0c;生活空间也广。美国的年薪一般是3.0-6.5万美金左右&#xff0c;刚博士毕业出来…

无脑霸总漫开播,她穿书变成恶毒女配,本想和霸总离婚摆烂

无脑霸总漫开播&#xff0c;她穿书变成恶毒女配&#xff01;本想和霸总离婚摆烂&#xff0c;不料却被霸总盯上了&#xff5e;虐妻一时爽&#xff0c;追妻火葬场&#xff0c;曾经的我你爱搭不理&#xff0c;现在的我你高攀不起&#xff01;#无脑霸总漫开播 #如何在无脑霸总漫里艰…

Sql Server数据库实现表中字段的列加密研究

1、问题描述 去年6月份的时候做过一个薪酬系统&#xff0c;要对里面的一些敏感字段进行一下加密。Sqlserver列加密可以参考官方文档&#xff1a;SQL Server 技术文档 - SQL Server | Microsoft Learn。主要看下来有三种加密方法&#xff1a;1、利用证书对数据进行加密和解密。2…

Google Guice 3:Bindings(1)

1. 序言 上一篇博客&#xff0c;《Google Guice 2&#xff1a;Mental Model》&#xff0c;讲述了Guice的建模思路&#xff1a;Guice is a map Guice官网认为&#xff1a;binding是一个对象&#xff0c;它对应Guice map中的一个entry&#xff0c;通过创建binding就可以向Guice …

RocketMQTemplate 实现消息发送

代码托管于gitee&#xff1a;easy-rocketmq 文章目录一、前置工作二、消费者三、生产者1. 普通消息2. 过滤消息3. 同步消息4. 延时消息5. 批量消息6. 异步消息7. 单向消息8. 顺序消息9. 事务消息概要Demo源码解读一、前置工作 1、导入依赖 <dependency><groupId>…