本文为拉勾网《32个Java面试必考点》学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频《32个Java面试必考点》.若本文侵犯了相关所有者的权益,请联系:txzw@live.cn.将会删除相关内容

消息队列与数据库

  • 知识点汇总
    • 消息队列
      • RabbitMQ
      • ActiveMQ
      • RocketMQ
      • kafka
    • 数据库
      • 关系型数据库
      • NoSQL(Not Only SQL)
      • NewSQL
    • 数据库范式
  • 知识详解
    • Kafka架构
    • Kafka消息生产/生产流程
    • 数据库事务
      • 事务特性
      • 事务并发问题与隔离级别
      • 事务分类
    • MySQL
      • 索引
      • MySQL调优
  • 考察点
  • 加分项
  • 真题汇总

知识点汇总

消息队列

RabbitMQ

Erlang开发的开源消息队列,通过Erlang的Actor模型,实现了数据的稳定可靠传输.支持AMQP,XMPP,SMPP等多种协议,因此也比较重量级,由于采用broker代理架构,发送给客户端时,先在中间队列进行排队.RabbitMQ单机吞吐量在万级不算很高

ActiveMQ

可部署于代理模式和P2P模式,同样支持多种协议,单机吞吐量在万级.但是不够轻巧,对于队列较多的时候支持不是很好,并且有较低概率丢失消息

RocketMQ

阿里开源的消息中间件,单机支持十万级的吞吐量,使用Java开发具有高吞吐量,高可用性的特点,适合在大规模分布式系统中使用

kafka

有Scala开发的跨语言高性能分布式消息队列,单机吞吐量在十万级,消息延迟在毫秒级.完全的分布式系统,blocker,producer,consumer都是原生自动支持分布式,依赖ZooKeeper做分布式协调.支持一写多读,可被多个消费者消费.消息皆不会丢失,但可能重复

数据库

关系型数据库

  • Oracle

    • 功能强大,缺点贵
  • MySQL
    • 互联网行业中最流行的数据库
  • MariaDB
    • MySQL的分支,由开源社区维护
  • PostgreSQL
    • 类似于Oracle的多进程模型,可支持高并发的应用场景,几乎支持所有SQL标准,适合严格的企业应用场景

NoSQL(Not Only SQL)

  • Redis

    • 适用于数据变化快,数据大小可预测的场景
  • MongoDB
    • 基于分布式文件存储的数据库
    • 将数据存储为一个文档,数据结构由键值对组成
    • 适用于表结构不明确,数据结构不断发生变化的场景
    • 不适合有事务和复杂查询的场景
  • Hbase
    • 是在hdfs(Hadoop Distributed File System hadoop分布式文件系统)中分布式面向列的数据库,类似于Google的Bigtable
    • 可提供快速随机访问海量结构化数据,在表中由行排序,一个表中有多个列族,每个列族有任意数量的列
    • 依赖于hdfs,可以实现海量数据的可靠存储,适用于数据量大,写多读少,不需要复杂查询的场景
  • Cassandra
    • 高可靠大规模分布式存储系统
    • 支持分布是的结构化K-V存储
    • 以高可用为主要目标
    • 适合写多场景,简单查询,不适合数据统计
  • Pika
    • 提供大容量类Redis的存储服务
    • 兼容Redis的五种数据结构的大部分命令
    • 使用磁盘存储,解决Redis存储成本问题

NewSQL

  • TiDB

    • 开源分布式关系型数据库
    • 几乎完全兼容MySQL
    • 支持水平弹性扩展,ACID事务,标准SQL,MySQL语法和MySQL协议
    • 具有数据强一致性的高可用性
    • 既适合在线事务处理,也适合在线分析处理
  • OceanBase
    • 蚂蚁金服所有,满足金融级数据可靠性以及数据一致性要求的数据库系统
    • 以商业化不再开源

数据库范式

范式级别越高,对数据表要求的越严格

  • 第一范式(最低)

    • 要求表中的字段不可再拆分
  • 第二范式
    • 在满足第一范式的基础上,要求每条记录由主键唯一区分,记录中的所有属性都依赖与主键
  • 第三范式
    • 在满足第二范式的基础上,要求所有属性直接依赖于主键,不允许间接依赖
  • 巴斯-科德范式(一般满足至此即可)
    • 在满足第三范式的基础上,要求联合主键的各字段之间互不依赖
  • 第四范式
  • 第五范式

知识详解

Kafka架构

  • Kafka集群有多个server组成,每个server称为一个Broker,为消息代理
  • Kafka中消息是按topic进行划分的,一个topic就是一个queue,实际应用中不同数据可设置为不同topic
  • 一个topic可以有多个consumer,当producer发送数据到topic中时,订阅了该topic的consumer都能接收到消息
  • 为提高并行能力,维护了多个portion分区,每个portion保证id唯一且有序,新消息会储存在队尾,
  • portion持久化时会分段,保证对较小的文件进行写操作,以提高性能
  • 每个topic会被分为多个portion,存于多个broker上,以保证容灾

Kafka消息生产/生产流程

  • 对consumer进行分组管理,以支持消息的一写多读
  • producer有多种方式选择portion,轮循(默认),指定,根据key值得hash选择portion
  • 消息得发送有三种
    • 同步(默认):producer发送消息时,同步获得反馈
    • 异步:producer以batch的方式push消息,可以极大地提高性能,也增加消息丢失风险
    • oneway:只发送消息,不返回结果
  • Kafka确保每个group中只能有一个consumer消费
  • 通过group coordinator管理哪个consumer负责消费哪个portion.默认支持range和轮循分配
  • 在zookeeper中保存了每个topic的每个portion的消费偏移量offset.通过更新offset,以保证每条消息都被消费

ps.每个consumer线程相当于一个consumer实例,当consumer group中的consumer数量大于portion时,有的consumer会读取不到数据

数据库事务

事务特性

事务并发问题与隔离级别

事务分类

  • 扁平事务:所有操作都在同一层次(日常使用最多).缺点:不能提交事物的某一部分
  • 带保存点的扁平事务:在事务中插入保存点,失败回滚时,可回滚至任意保存点,而不是回滚整个事务
  • 链事务:可看作上一事务的变种,事务提交时会将上下文隐式传递给下一个事务,事务失败时,回滚至最近的事务
  • 嵌套事务:由上层事务和子事务组成,类似树形结构.顶层事务负责逻辑处理,子事务负责具体操作.子事务提交后需等待上层事务提交才算完成,若上层事务回滚,则所有子事务回滚
  • 分布式事务:分布式环境中的扁平化事务
    • XA规范:保证强一致性的刚性事务方案

      • 两段式提交

        • 需要事务协调者保证,事务参与者都完成第一阶段的事务准备阶段.当都准备完成则通知事务参与者进行下一阶段事务.(类似于Java中的countdownlatch和cyclicbarruer)
        • 在一个进程发生故障时,会有较长时间的阻塞
      • 三段式提交
        • 增加PreCommit环节,减少两段式提交中的阻塞时间
    • TCC:满足最终一致性的柔性事务方案
      • 对每个操作都注册确认和补偿操作
      • try阶段:检测业务系统,预留资源
      • confirm阶段:确认提交
      • cancel阶段:业务执行错误时执行回滚,释放预留资源
    • 消息事务:消息一致性方案
      • 将本地操作与消息发送封装在一个事务中,保证本地操作与消息发送要么都成功,要么都失败
      • 下游应用收到收到消息执行对应操作
    • GTS/Fescar

MySQL


以下是曾经收集的SQL笔记:

索引

可大幅增加数据库的查询性能,适合读多写少的场景
代价:需要额外空间保存索引,插入更新删除时,由于更新索引增加额外的开销

  • 索引类型

    • 唯一索引

      • 索引列中的值唯一,允许出现空值
    • 主键索引
      • 特殊的唯一索引不允许出现空值
    • 普通索引
      • 索引列中的值不唯一
    • 联合索引
      • 多个列按顺序组成索引,相同列不同顺序为不同索引
    • 全文索引
      • 只能在char varchar text等类型使用
  • 索引实现
    • B-Tree

      • 最常用
    • R-Tree
      • 用于处理多维数据的数据结构,可对地理数据进行空间索引
    • Hash
      • 效率比B-Tree高,不支持范围查找,排序等功能
    • FullText
      • 适用于全文索引

MySQL调优

  1. 表结构与索引

    • 分库分表,读写分离
    • 为字段选择合适的数据类型
    • 将字段多的表分拣成多个表,增加中间表
    • 混合范式与反范式,适当冗余
    • 为查询创建必要索引,但避免滥用
    • 尽可能地是以哦那个NOT NULL
  2. SQL语句优化
    • 寻找最需要优化的语句:分析慢查询日志

      • 使用频繁或效率最低的
    • 利用查询工具:explain,profile
    • 避免使用SELECT *, 只取需要的列
    • 尽可能使用prepared statements
    • 使用索引扫描来排序
  3. MySQL参数优化
  4. 硬件及系统配置
    从1到4优化成本增加,优化效果降低

考察点

  • 了解消息队列,数据库的基本原理和常用队列,数据库的特点

    • 消息队列适用于异步队列,削峰填谷
  • 了解Kafka的架构和消息处理流程
    • 如何通过portion保证并发能力与冗余灾备
    • consumer group如何保证每个consumer不会回去重复的雄消息
  • 理解数据库事务的ACID特性和隔离级别
  • 掌握常用的MySQL语句和常用函数
  • 了解MySQL数据库不同引擎多的特点以及不同类型的索引实现

加分项

  • 了解新特性
  • 知道数据可表设计原则,有设计经验
  • 有过数据可调优经验
  • 消息队列使用经验,不同场景下的取舍

真题汇总

  • 使用过消息队列吗,在什么场景使用,用来解决什么问题
  • 使用队列是如何保证可靠性
  • MQ有可能发生重复消费吗,如何解决
  • 数据库查询语句很慢,如何优化
  • 数据库事务有哪些特性,事务隔离级别有哪几种
  • 如何随SQL语句进行优化

拉勾网《32个Java面试必考点》学习笔记之十一------消息队列与数据库相关推荐

  1. 拉勾网《32个Java面试必考点》学习笔记之二------操作系统与网络知识

    本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...

  2. 拉勾网《32个Java面试必考点》学习笔记之一------Java职业发展路径

    本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...

  3. 拉勾网《32个Java面试必考点》学习笔记之十二------架构演进与容器技术

    本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...

  4. java 32个Java面试必考点

    转:https://blog.csdn.net/werqerwer 一:https://blog.csdn.net/werqerwer/article/details/88061689  Java职业 ...

  5. Java开发面试高频考点学习笔记(每日更新)

    Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...

  6. Java面试必考点第05讲:数据结构与算法

    本课时的主题为数据结构与算法.行业里流行一种说法:程序 = 数据结构 + 算法.虽然有些夸张,但足以说明数据结构与算法的重要性.本课时重点讲解四个知识点: 从搜索树到 B+ 树,讲解与树有关的数据结构 ...

  7. Java面试必考点笔记(二)---职业发展路径

    职业规划 岗位划分 岗位选择 面试流程 面试前准备工作 面试考察点 4类技能

  8. 95% 的算法都是基于这 6 种算法思想,大厂Java面试必考点

    // 当前结点的 id 符合查找条件,返回当前结点 if(node.id === id) return node // 前结点的 id 不符合查找条件,继续查找它的每一个子结点 for(var i = ...

  9. Java高并发程序设计学习笔记(十一):Jetty分析

    转自:https://blog.csdn.net/dataiyangu/article/details/87894253 new Server() 初始化线程池 QueuedThreadPool ex ...

最新文章

  1. html怎么移动文字的位置,css怎么移动文字
  2. 近期要推出的ISA2006系列文章
  3. 程序设计语言常见面试题
  4. C++中static关键字作用
  5. Swift - 程序进入后台,以及应用终止时调用的方法
  6. echart封装,前端简单路由,图表设置自动化
  7. c# 委托和事件(总结篇)
  8. 超图桌面版新建一个简单三维数据集并发布
  9. 容器set和multiset
  10. poj2912(种类并查集+枚举)
  11. Scott Mitchell 的ASP.NET 2.0数据教程之四十五::DataList和Repeater数据排序(三)
  12. SAP HANA Schemas 和 HDI Containers
  13. 存储基础:磁盘 IO 为什么总叫你对齐?
  14. android studio课程管理系统,8 个最优秀的 Android Studio 插件
  15. (33)FPGA面试题附加约束的作用
  16. 大数据_Spark框架_快速上手_word count 案例分析---Spark工作笔记0005
  17. oracle dbua 升级,33篇Oracle升级文档大全(收藏版)
  18. 存到mysql的中文乱码_web项目存数据到数据库,中文乱码,解决过程
  19. Boost Asio 使用技巧
  20. Apache CXF 入门第一个示例

热门文章

  1. PCB拼板之多款矩形排样算法实现--学习
  2. you-get和youtube-dl
  3. Springboot——多个pdf文件合并成一个工具类编写
  4. 历史文章之深思4 rockey5 rockey6 新一代加密狗乱弹
  5. 6.JAVA-链表实例
  6. 直接从数据库里修改桌面图标
  7. 斑马888-TT不认新纸
  8. Android TextView 是否有省略号,动态获取和设置行数
  9. windows下无法打开Qt designer,显示已停止工作
  10. 国外的用户发现无法访问迅雷看看