Skip to content

Commit

Permalink
data
Browse files Browse the repository at this point in the history
  • Loading branch information
deipss committed Feb 19, 2024
1 parent 9859da0 commit da218e3
Show file tree
Hide file tree
Showing 13 changed files with 391 additions and 191 deletions.
2 changes: 1 addition & 1 deletion _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ aux_links:
mermaid:
# Version of mermaid library
# Pick an available version from https://cdn.jsdelivr.net/npm/mermaid/
version: "10.5.1"
version: "10.8.1"


# For copy button on code
Expand Down
21 changes: 20 additions & 1 deletion docs/Database/mysql.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,30 @@ EXPLAIN SELECT * FROM users WHERE age > 25;
* **select_type**: 查询的类型(例如 SIMPLE, SUBQUERY, DERIVED 等)。
* **table**: 输出的表名。
* **type**: 访问类型(例如 ALL, index, range, ref, eq_ref, const, system, NULL)。
https://www.cnblogs.com/xxoome/p/14434061.html **务必浏览此文档**
* **possible_keys**: 可能使用的索引。
* **key**: 实际使用的索引。
* **key_len**: 使用的索引的长度。
* **ref**: 哪些列或常量被用作索引查找的参考。
* **rows**: 估计需要检查的行数。
* **Extra**: 额外的信息,如 "Using where", "Using index", "Using temporary", "Using filesort" 等。
为了获得最佳的性能,你应该经常使用 `EXPLAIN` 来检查你的查询,并根据其建议进行优化。
为了获得最佳的性能,你应该经常使用 `EXPLAIN` 来检查你的查询,并根据其建议进行优化。
# 4. InnoDB和MyISAM的区别
InnoDB和MyISAM是MySQL数据库管理系统中最常用的两种存储引擎,它们在处理数据库事务、锁定机制、存储方式等方面有一些显著的区别。
1. 事务处理:InnoDB支持事务处理,具有ACID特性,提供了更好的数据完整性和并发性能。
而MyISAM不支持事务处理,这意味着它无法提供数据的原子性、一致性、隔离性和持久性保证。
2. 锁定机制:InnoDB支持行级锁定,这可以提高并发访问的性能,因为它允许多个事务同时访问不同的数据行。
而MyISAM只支持表级锁定,当对一个表进行操作时,会锁定整个表,这可能会降低并发性能。
3. 存储方式:InnoDB将数据存储在磁盘上的InnoDB表空间数据文件中,表的大小只受限于操作系统文件的大小。
而MyISAM将数据存储在三个文件中,包括表定义文件(.frm)、数据文件(.MYD)和索引文件(.MYI)。
4. 外键支持:InnoDB支持外键约束,这有助于维护数据的引用完整性。而MyISAM则不支持外键。
5. 性能:在某些情况下,MyISAM的性能可能会比InnoDB更好,尤其是在执行大量的SELECT查询时。
这是因为MyISAM的表强调的是性能,其执行速度比InnoDB更快。然而,在需要执行大量的INSERT、UPDATE或DELETE操作时,
InnoDB通常表现更好,因为它支持事务处理和行级锁定。
综上所述,InnoDB和MyISAM各有其优点和适用场景。在选择存储引擎时,应根据具体的应用需求和性能要求来决定使用哪种引擎。
29 changes: 29 additions & 0 deletions docs/spring/kafka面试.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
layout: default
title: kafka面试
parent: Spring
---




1. 请简述Kafka是什么,以及它的主要用途。
2. Kafka的基本架构是怎样的?能否详细解释一下各个组件的作用?
3. 在Kafka中,生产者发送消息的过程是怎样的?有哪些关键的配置参数?
4. Kafka中的消费者是如何消费消息的?它支持哪些消费模式?
5. Kafka是如何保证消息的高可用性和持久性的?它的数据是如何存储和复制的?
6. 请描述一下Kafka的分区策略和分区数对性能和可用性的影响。
7. Kafka支持哪些数据压缩算法?它们对性能和存储的影响是什么?
8. 在Kafka中,如何处理消息的延迟和堆积问题?
9. Kafka的容错机制是怎样的?当Broker宕机时,如何保证消息不丢失?
10. Kafka与传统的消息队列系统(如RabbitMQ、ActiveMQ)相比,有哪些优势和不足?
11. Kafka在哪些场景下适用?是否有一些使用Kafka的最佳实践?
12. 请描述一下Kafka的扩展性和伸缩性。如何根据业务需求调整Kafka集群的规模?
13. Kafka的监控和运维有哪些工具和方法?如何保证Kafka的稳定性和性能?
14. 在Kafka中,如何处理消息的幂等性和去重问题?
15. Kafka是否支持事务消息?如果支持,它是如何实现的?
16. 请简述Kafka的流处理功能。它与传统的消息队列系统有何不同?
17. Kafka与其他大数据处理组件(如Hadoop、Spark)是如何集成的?
18. Kafka的安全性如何保障?它支持哪些认证和授权机制?


27 changes: 27 additions & 0 deletions docs/spring/rocketmq面试.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
layout: default
title: rocketmq面试
parent: Spring
---

1. 请简述RocketMQ的主要概念和特点。
2. RocketMQ中的Broker和NameServer分别扮演什么角色?
3. 在RocketMQ中,生产者发送消息的负载均衡是如何实现的?
4. 请描述一下RocketMQ的消费者订阅消息的负载均衡策略。
5. RocketMQ是如何保证消息的高可用性的?
6. 请描述一下RocketMQ的工作流程。
7. RocketMQ的存储机制是怎样的?它的存储结构有何特点?
8. 为什么RocketMQ的性能比较高?有哪些因素影响了它的性能?
9. 在RocketMQ中,消息被消费后会被立即删除吗?消息会如何被清理?
10. 请描述一下RocketMQ的部署架构和部署类型,以及它们的特点。
11. 你是否有过部署RocketMQ的经验?如果有,请描述一下你当时的部署过程。
12. RocketMQ如何处理消息的持久化和可靠性?
13. 请简述RocketMQ中的Topic和JMS的Queue之间的区别。
14. RocketMQ支持哪些消息模式?请详细描述一下。
15. 在RocketMQ中,如何保证消息的顺序性?
16. RocketMQ的监控和运维有哪些工具和方法?
17. 请描述一下RocketMQ中的事务消息是如何实现的。
18. RocketMQ如何处理消息的延迟和定时发送?
19. 请简述RocketMQ中的消息过滤机制。
20. 在RocketMQ中,如何处理消息的重复消费问题?

11 changes: 6 additions & 5 deletions docs/spring/zookeeper.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ parent: Spring

## 1.1. 特点

- 分布性系统在空间维度,不是集中统一,是随意分布
- 没有主次之分,没有方便管理和被管理的角色,各节点是对等的,但是有副本(对数据和服务冗余的一种方式)
- 并发性:分布式系统会并发的读写一些被共享的存储数据,需要准确高效地协调这些并发操作
- 缺乏全局时钟:读写存在时序性,谁先谁后,需一个全局的时钟序列控制
- 故障总会发生
1. 分布性系统在空间维度,不是集中统一,是随意分布
2. 没有主次之分,没有方便管理和被管理的角色,各节点是对等的,但
是有副本(对数据和服务冗余的一种方式)
3. 并发性:分布式系统会并发的读写一些被共享的存储数据,需要准确高效地协调这些并发操作
4. 缺乏全局时钟:读写存在时序性,谁先谁后,需一个全局的时钟序列控制
5. 故障总会发生

## 1.2. 问题

Expand Down
66 changes: 32 additions & 34 deletions docs/spring/事务.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,28 @@ parent: Spring

# 1. 事务的特性

- 原子性(Atomicity): 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。

- 一致性(Consistency): 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

- 隔离性(Isolation): 一个事务的执行不能被其他事务干扰。

- 持续性/永久性(Durability): 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
1. 原子性(Atomicity): 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
2. 一致性(Consistency): 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
一致性与原子性是密切相关的。
3. 隔离性(Isolation): 一个事务的执行不能被其他事务干扰。
4. 持续性/永久性(Durability): 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

# 2. 脏读、不可重复读、幻读

- 脏读:事务A读取事务B没有提交的数据,如余额B修改前是1000,修改后是2000,事务读取了2000,但B发生异常,回滚后,真实的金额是1000,所以A读取的脏数据
- 不可重复读:事务A第一次读取了单据的状态是未提交,去请求一个较长的IO数据,事务B把这个单据状态给置为取消了,事务A的IO结束,再取一次单据的状态,和第一次不一样,就是不可重复读
- 幻读:事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。
1. 脏读:事务A读取事务B没有提交的数据,如余额B修改前是1000,修改后是2000,事务读取了2000,
但B发生异常,回滚后,真实的金额是1000,所以A读取的脏数据
2. 不可重复读:事务A第一次读取了单据的状态是未提交,去请求一个较长的IO数据,事务B把这个单据状态给置为取消了,
事务A的IO结束,再取一次单据的状态,和第一次不一样,就是不可重复读
3. 幻读:事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,
这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。

> 不可重复读和幻读的区别是,前者是update,后者是insert
# 3. 事务的隔离级别

mysql中,默认的事务隔离级别是可重复读(repeatable-read),为了解决不可重复读,innodb采用了MVCC(多版本并发控制)来解决这一问题。
MVCC是利用在每条数据后面加了隐藏的两列(创建版本号和删除版本号),每个事务在开始的时候都会有一个递增的版本号,用来和查询到的每行记录的版本号进行比较。
Mysql中,默认的事务隔离级别是**可重复读(repeatable-read)**,为了解决不可重复读,Innodb采用了MVCC(多版本并发控制)来解决这一问题。
MVCC是利用在每条数据后面加了隐藏的两列(创建版本号和删除版本号),每个事务在开始的时候都会有一个递增的版本号,
用来和查询到的每行记录的版本号进行比较。
MYSQL MVCC

| 事务级别 | 脏读 | 不可重复读 | 幻读 |
Expand All @@ -41,13 +43,12 @@ MYSQL MVCC

在事务A中,存在事务B,就出现了事务的传播。Spring中事务的传播有以下几类:

Spring 中org.springframework.transaction.annotation.Propagation类的定义

```java
// Spring中org.springframework.transaction.annotation.Propagation类的定义
public enum Propagation {
// 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
//当前方法存在事务时,子方法加入该事务。此时父子方法共用一个事务,无论父子方法哪个发生异常回滚,整个事务都回滚。即使父方法捕捉了异常,也是会回滚。而当前方法不存在事务时,子方法新建一个事务。

//当前方法存在事务时,子方法加入该事务。此时父子方法共用一个事务,无论父子方法哪个发生异常回滚,
// 整个事务都回滚。即使父方法捕捉了异常,也是会回滚。而当前方法不存在事务时,子方法新建一个事务。
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),

// 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
Expand All @@ -57,7 +58,8 @@ public enum Propagation {
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),

// 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
// 无论当前方法是否存在事务,子方法都新建一个事务。此时父子方法的事务时独立的,它们都不会相互影响。但父方法需要注意子方法抛出的异常,避免因子方法抛出异常,而导致父方法回滚。
// 无论当前方法是否存在事务,子方法都新建一个事务。此时父子方法的事务时独立的,
// 它们都不会相互影响。但父方法需要注意子方法抛出的异常,避免因子方法抛出异常,而导致父方法回滚。

REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),

Expand All @@ -68,7 +70,8 @@ public enum Propagation {
NEVER(TransactionDefinition.PROPAGATION_NEVER),

// 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED
// 当前方法存在事务时,子方法加入在嵌套事务执行。当父方法事务回滚时,子方法事务也跟着回滚。当子方法事务发送回滚时,父事务是否回滚取决于是否捕捉了异常。如果捕捉了异常,那么就不回滚,否则回滚。
// 当前方法存在事务时,子方法加入在嵌套事务执行。当父方法事务回滚时,子方法事务也跟着回滚。
// 当子方法事务发送回滚时,父事务是否回滚取决于是否捕捉了异常。如果捕捉了异常,那么就不回滚,否则回滚。
NESTED(TransactionDefinition.PROPAGATION_NESTED);
}
```
Expand All @@ -79,32 +82,30 @@ public enum Propagation {

声明式事务是建立在 AOP 之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况“提交”或者“回滚”事务。


```java
@Transactional
public void methodA(){
jdbcTemplate.batchUpdate(updateSql, params);
methodB();
}
jdbcTemplate.batchUpdate(updateSql,params);
methodB();
}

// 传播行为配置为 - 方式2,不使用当前事务,独立一个新事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB(){
jdbcTemplate.batchUpdate(updateSql, params);
}
jdbcTemplate.batchUpdate(updateSql,params);
}
```

## 5.2. 编程式

编程式事务使用 TransactionTemplate 或者直接使用底层的 PlatformTransactionManager 实现事务。 对于编程式事务 Spring 比较推荐使用
编程式事务使用 TransactionTemplate 或者直接使用底层的 PlatformTransactionManager 实现事务。
对于编程式事务 Spring 比较推荐使用
TransactionTemplate 来对事务进行管理。
其中 TransactionTemplate 的 execute 能接受两种类型参数执行事务,分别为:


```shell
```Java
TransactionCallback<Object>(): 执行事务且可以返回一个值。
TransactionCallbackWithoutResult(): 执行事务没有返回值。

```

# 6. 事务的回滚
Expand All @@ -123,21 +124,18 @@ TransactionTemplate 来对事务进行管理。
# 7. 事务的失效

## 7.1. 只能外部类来调用
若同一类中的其他没有 @Transactional 注解的方法内部调用有 @Transactional 注解的方法,有 @Transactional 注解的方法的事务会失效。

若同一类中的其他没有 @Transactional 注解的方法内部调用有 @Transactional 注解的方法,有 @Transactional 注解的方法的事务会失效。
这是由于 Spring AOP 代理的原因造成的,因为只有当 @Transactional 注解的方法在类以外被调用的时候,Spring 事务管理才生效。

另外,如果直接调用,不通过对象调用,也是会失效的。因为 Spring 事务是通过 AOP 实现的。

## 7.2. 只能public

@Transactional 注解只有作用到 public 方法上事务才生效。被 @Transactional 注解的方法所在的类必须被 Spring 管理。

## 7.3. 底层数据库要支持
底层使用的数据库必须支持事务机制,否则不生效。




底层使用的数据库必须支持事务机制,否则不生效。

# 8. 参考文献

Expand Down
2 changes: 1 addition & 1 deletion docs/test/Jmeter.md → docs/test/Jmeter Mac.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
layout: default
title: Jmeter
title: Jmeter Mac
parent: Test
---

Expand Down
Loading

0 comments on commit da218e3

Please sign in to comment.