两种数据库
关系型数据库:MySQL、SQL Server、Oracle 存储方式是用表
非关系型数据库:MongoDB、Redis 存储方式是键值对
常用的锁有哪些
互斥锁、自旋锁、读写锁、乐观锁、悲观锁
三大范式
第一范式:要求一张表中的每一列是不可分割的原子数据
第二范式:消除部分依赖,要求一张表中的每一列都完全依赖于主键(针对于组合主键),也就是不会出现某一列只和部分主键相关;
第三范式:消除传递依赖,要求一张表中的每一列都和主键是直接依赖的,不是间接依赖。
数据库的乐观锁和悲观锁
悲观锁:
①悲观锁总是认为数据会被其他线程修改,所以在修改前强制加锁,使其他线程阻塞等待,具有强烈的独占和排他特性。
②传统的关系型数据库的行锁,表锁,读锁,写锁等,以及Java中synchronized关键字都是悲观锁的实现。
③悲观锁比较适用于写多读少的情况(多写场景)。
悲观锁实际上是“先取锁再访问”的保守策略,为数据的安全提供了保证。
乐观锁:
①乐观锁认为在一般情况下数据不会被其他线程修改,所以在修改前不会加锁,而是在数据提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。
②乐观锁不会刻意使用数据库本身的锁机制,而是依据数据本身来保证数据的正确性,如加版本号字段、时间戳、AtomicInteger类的CAS(比较并交换)、MySQL中InnoDB的MVCC(多版本控制)机制等都是乐观锁的实现。
③乐观锁比较适用于读多写少的情况(多读场景)
MySQL一条语句查询慢的原因是啥?
原因:
① 电脑系统内存不足;
② 网络突然降速了;
③ 所写的SQL语句不是最优解
解决方案:两条快于一条;精准快于全表;建立索引。
Redis的五大基本类型
String 字符串、List列表、Hash散列(Value本身又是键值对)、set集合、zset有序集合。
Redis的两种持久化方式
-
RDB将数据库中的数据定期以快照的方式存储到磁盘,保存到rdb中,并在启动时自动加载rdb文件,以达到持久化的需要;它的优点呢是数据恢复快,缺点是保存不是实时产生的。会在设置的时间内进行保存。
-
AOF,把每一次的操作都记录到一个文件中,当redis进行重启时会将AOF文件中所有操作都执行一遍,确保恢复数据。需要开启,也有设置;优点是任何写的数据不会丢失,缺点是文件大,耗能高,数据恢复快,冗余多。
Redis的默认持久化方式是RDB
Redis中的删除策略
主要包括三种删除策略:
(1)定时删除(时间换空间)
(2)惰性删除(内存占用严重,空间换时间)
(3)定期删除(随机清理删除,前两者结合)
ACID四大特性
-
原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
-
一致性:数据库总是从一个一致性状态转移到另一个一致性的状态。一致性确保了即使在执行第三、第四条语句之间时系统崩溃,前面执行的第一、第二条语句也不会生效,因为事务最终没有提交,所有事务中所作的修改也不会保存到数据库中。
-
隔离性:一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
-
持续性:指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
事务的四大隔离级别
-
序列化:如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离。
-
可重复读:在可重复读在这一隔离级别上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。
-
提交读:READ COMMITTED 隔离级别的安全性比 REPEATABLE READ 隔离级别的安全性要差。处于
READ COMMITTED 级别的事务可以看到其他事务对数据的修改。也就是说,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个 SELECT 语句可能返回不同的结果。容易造成“脏读” -
未提交读:READ UNCOMMITTED 提供了事务之间最小限度的隔离。除了容易产生虚幻的读操作和不能重复的读操作外,处于这个隔离级的事务可以读到其他事务还没有提交的数据,如果这个事务使用其他事务不提交的变化作为计算的基础,然后那些未提交的变化被它们的父事务撤销,这就导致了大量的数据变化。
聚簇索引和非聚簇索引区别
1. 聚簇索引
并不是一种单独的索引类型,而是一种数据存储方式。当表有了聚簇索引的时候,表的数据行都存放在索引树的叶子页中。无法把数据行放到两个不同的地方,所以一张表只允许有一个聚簇索引。InnoDB的聚簇索引实际上是将索引和数据保存中同一个B-Tree中。InnoDB通过主键聚集数据,如果没有定义主键,InnoDB会选择一个唯一的的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。
2. 非聚簇索引
又叫二级索引。二级索引的叶子节点中保存的不是指向行的物理指针,而是行的主键值。当通过二级索引查找行,存储引擎需要在二级索引中找到相应的叶子节点,获得行的主键值,然后使用主键去聚簇索引中查找数据行,这需要两次B-Tree查找。
左连接和右连接
左连接: 在 LEFT JOIN 左边的表里面数据全被全部查出来,右边的数据只会查出符合ON后面的符合条件的数据,不符合的会用NULL代替。
内连接: 相当于左连接与右连接的合并,去掉所有含NULL的数据行,剩下的就是查询出来的数据了。其实就是两边的表都必须满足条件。
消息队列
Kafka
优点:吞吐量非常大,性能非常好,集群高可用。
缺点:会丢数据,功能比较单一
使用场景:日志分析、大数据采集
RebbitMQ
优点:消息可靠性高,功能全面。
缺点:吞吐量比较低,消息积累会严重影响性能。erlang语言不好定制。
使用场景:小规模场景。
RocketMQ (阿里产品)
优点:高吞吐、高性能、高可用,功能非常全面。
缺点:开源版功能不如云上商业版。官方文档和周边生态还不够成熟。客户端只支持java
使用场景:几乎是全场景。
Linux的熟悉情况
上过这个课,安装系统,会一些简单的命令,多用户多任务的操作系统。