后端总结知识点(一)

90 阅读3分钟

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战

一、数据库

1. MySQL

  1. 手撕SQL:找到有3门科目不及格的前三名学生。(group by ... having count(*) ...)
  2. Innodb 并发读写锁 MVVC 算法(多版本并发控制,用于读已提交、重复读的情况):对比版本号(时间戳),类似CAS。
  3. 两种常用引擎:MyISAM,Innodb;区别:读多还是写多,是否支持全文搜索、行锁、故障恢复、同时读写(In有两段锁)。
  4. Mysql 慢查询(日志):需要修改配置去开启。配合 explain 指令分析 SQL 效率。
  5. 针对隔离性遇到的问题:脏读,不可重复读,幻读。
  6. 第一范式:列值是原子的。第二范式:有候选码。第三范式:某一列不依赖其他非主列。BCNF:任何非主属性不能对主键子集依赖。
  7. SQL优化:①增加合适的索引,查询时覆盖索引;②避免使用in关键字和子查询,改用join联表查询;③避免使用左模糊和全模糊like匹配查询,建议用搜索引擎代替;④limit限制查询条数,优化分页效率;⑤排序时尽量利用索引的有序性提升效率;⑥超多分页场景下利用延迟关联或者子查询优化;⑦避免设置唯一索引,影响insert效率;⑧不使用外键与级联,应在应用层解决。
  8. MySQL两段锁即加锁、解锁阶段(提交或回滚)。锁又分为共享锁(读锁)和排它锁(写锁)。
  9. MySQL 的 XA 两阶段提交(用于分布式数据库):Prepare + Commit,P【向所有数据库服务器发送 prepare 通知,进入 ready 可提交状态】C【若第一阶段出现任一失败则事务失败,否则事务管理器发出“确认提交”请求,最终数据库服务器返回“提交完成”响应】。
  10. select for update (of A.id) 在查询时开启事务,of 语句可针对指定的表加锁,不加 of 则默认所有涉及的表都加锁。

2. 事务

  1. 四种隔离级别:未提交读,提交读,可重复读,序列化(串行)
  2. 并发下出现的问题:脏读(读了未提交的数据)、不可重复读(更新)、幻读(新增或删除)
  3. ACID:原子性,一致性,隔离性,持久性
  4. TCC分布式事务: try + confirm/cancel(rollback)

3. Redis

  1. 基本数据类型:键值对、哈希表、列表、集合、有序集合。
  2. 持久化方式:① RDB:指定时间间隔内触发某种条件,生成数据快照,缺点是备份慢实时性较低;② AOF:日志文件追加,缺点是恢复慢。
  3. 键值过期清理策略:①[被动清除]:定时轮询清除过期键。② [主动清除]:再次访问时发现键已过期,执行清除并返回获取失败。③ [主动内存]不足清除:需要额外空间时优先清除过期键释放内存。
  4. 操作系统:①进程和线程的区别:进程是系统资源基本单位;线程是CPU调度的基本单位,共享进程的资源。② 通信方式:有名管道(无名管道),Socket套接字,消息队列,共享内存(进程内)

4. 死锁必要四个条件:

  1. 互斥条件:资源只能被一个进程独占。
  2. 请求和保持条件:请求新资源时,不释放已占有的资源。
  3. 不可剥夺条件:不可强制抢占其他进程已经占用的资源。
  4. 环路等待条件:存在资源请求的环路。