- 大数据中的 三架马车是指?
- 单元化 / 集群 / 异地/多地 / 就近原则 / 亲和性?
- OLTP 和 OLAP
- 数据处理的3步:
- MPP数据库 -海量并行数据库
- 关系型 / nosql / 时序数据库
- mysql的order by原理 / mysql的存储引擎
- 静态代理/ 动态代理 — cglib 代理/ jdk 代理 – 实际意义上为: 对于字节码的修改/生成 — ASM技术 --动态插桩
- exception 和 runtimeexception 有什么区别吗? 为什么自定义异常的时候就是 runtimeexception
- redis的淘汰策略
- ISR : 提供ISR(In-Sync Replicas)的多副本机制、基于Paxos协议的强一致存储版本等
- netty / 粘包/ 拆包/ 丢包
- CFS是Completely Fair Scheduler简称,即 - 完全公平调度器
- LSM树结构(Log-Structured-Merge-Tree) – VS B+/B ;
- 网络七层模型 - 各层的数据结构/形式; as: socket
- hadoop :一个大数据处理的开源框架;分为4个模块
- Spark VS hadoop
- 数据反压 or 快速失败?? fastover / fastfail
- Kafka 的攒批机制 (accumulate,参数为 linger.ms) 和 Nagle 算法
- 存储引擎有 in-place updates(原地更新)和 out-of-place updates(异地更新
- 增量写入 — mysql 是怎么做的呢? oceanbase?什么changebuffer啥的
- kafka 又是怎么做的呢? 攒批?
- 顺序写✍️?? 随机写?? 顺序读??随机写???
- WAL(Write-ahead logging,预写式日志)的方式来保证数据的可靠性
- sst
- RPC VS 异步RPC
- RocketMQ 使用的是基于TCP 的自定义协议; 消息中间件常用的协议:OpenWire、AMQP、MQTT、Kafka、OpenMessage;
- 消息持久化的方式 / kv数据库/关系DB/磁盘存储 - (存储速度上)文件系统 > 分布式KV(持久化)> 分布式文件系统 > 数据库(而可靠性却截然相反;)
- 在阿里内部围绕 RocketMQ 内核打造了三款产品,分别是 MetaQ、Notify 和 Aliware MQ,这三者分别采用了不同的模型:
- MetaQ 主要使用了拉模型,解决了顺序消息和海量堆积问题;
- Notify 主要使用了推模型,解决了事务消息;
- 云产品 Aliware MQ 则是提供了商业化的版本;
- RocketMQ 在 4.3 版中开始支持分布式事务消息,采用 2PC 的思想来实现提交事务消息,同时增加一个补偿逻辑来处理二阶段超时或者失败的消息
- 缓存: 客户端缓存、网络层缓存、本地缓存、分布式缓存
- 缓存的设计哲学,【想一想–缓存也是直接操作内存的 == meas 操作内存的一下中间件也是 会有相似之处的,比如什么驱逐?淘汰、同步、写入、读取…】
- 数据一致性问题 :强一致性、弱一致性、顺序一致性
- 前缀树/Trie树 的理解及适用场景( 最长前缀匹配算法(ip解析用的就是这个))-- trie:又稱字首樹或字典樹,是一種有序樹
- DFA算法,全称为确定性有限自动机算法,是一种用来识别和匹配特定模式的算法
- KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配
- 二叉树的广度优先遍历(BFS)-队列 和 深度优先遍历(DFS)-栈
- redis的数据结构 & 常用的api
- Using where; Using index和Using index condition区别是什么:using index 代表使用覆盖索引-并且符合最左前缀原则,一定是前导列,using where代表数据库引擎返回结果后mysql server还会再次筛选,using condition index代表使用二级索引不够还要回表, using tempoaray 说明使用了临时表
- Mysql有一点很重要是会默认按照group by排序,demo 加order by null 这样在group by的时候默认不排序,可以去掉filesort
- tinyint、smallint、int、bigint 的各自区别、所占字符,所示范围(ip的字段设置)
- 时间轮 – 底层是多个数组,区分不同单位而已;但是会有并发问题吧,当前的值应该是记录某个线程上而不是时间轮上,时间轮仅仅是个衡量单位而已
- 链表翻转 --gg 怎么都不会
- volatile 的特性我都忘记了…/ 伪共享 、 线程封闭是啥子来着?、监视器模式 、
对象发布的线程安全问题、同步容器 和 并发容器 有区别吗?同步的话means每个操作都加锁了,并发容器是针对多个线程并发访问,相较于同步容器提高了很多的性能;
copyOnwirte的好处和坏处,有何效果 – 是不是在哪个中间件中也有这样的原理/特性来着;
有界队列-管理资源的重要工具,生产这消费者 - 浅拷贝 、 深拷贝
- 对于异常处理 , Exception 需要在 方法上声明 或者 try catch进行捕获, 如果是 RunTimeException的话 则是可以不用声明;
如果我们自己自定义异常 继承于 Exception的话, 如果抛出了NPE、IllegalStateException… catch 自定义异常 是 捕获不住的 ,需要 catch Exception,catch() 的异常条件是不会去帮我们造型,并且是子类范围
这里需要关注一个重点,LSM树(Log-Structured-Merge-Tree)正如它的名字一样,LSM树会将所有的数据插入、修改、删除等操作记录(注意是操作记录)保存在内存之中,当此类操作达到一定的数据量后,再批量地顺序写入到磁盘当中。有点像kafka的攒批机制
这与B+树不同,B+树数据的更新会直接在原数据 - 就地更新 所在处修改对应的值,但是LSM数的数据更新是日志式的,当一条数据更新是直接append一条更新记录完成的。—这个就有点想 rdb/aof 的同步还是存储方式
这样设计的目的就是为了顺序写,不断地将Immutable MemTable flush到持久化存储即可,而不用去修改之前的SSTable中的key,保证了顺序写。
1)冗余存储,对于某个key,实际上除了最新的那条记录外,其他的记录都是冗余无用的,但是仍然占用了存储空间。因此需要进行Compact操作(合并多个SSTable)来清除冗余的记录。
2)读取时需要从最新的倒着查询,直到找到某个key的记录。最坏情况需要查询完所有的SSTable,这里可以通过前面提到的索引/布隆过滤器来优化查找速度
消息中间件具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步 RPC 的主要手段之一,但消息队列不是万能的,对于需要强事务保证而且延迟敏感的,RPC 是优于消息队列,此外也需要考虑使用的必要性,使用消息队列的场景很多,最常用的功能是异步、解耦和削峰,可应用于应用程序松耦合、异步处理模式、发布与订阅、最终一致性、错峰流控和日志缓冲等;RocketMQ 中并没有内置 Guava、Netty 等拆箱即用的速度流控组件(RateLimiter 和 TrafficShaping),而是借鉴排队理论
Using where; Using index和Using index condition,三者的区别主要在于是否需要全表扫描、是否使用了覆盖索引、以及是否采用了索引条件过滤等技术来提高查询性能;
1、Using where == (前提)查询的列被索引覆盖,并且where筛选条件是索引列之一但是不是索引的前导列,【 Extra中为Using where; Using index == 意味着无法直接通过索引查找来查询到符合条件的数据】;
2、Using index 场景 查询的列被索引覆盖 ,(前提)一定要覆盖索引,并且where筛选条件是索引的是前导列;
3、 Using index condition查询的列不全在索引中,where条件中是一个前导列的范围;
此外 NULL 是指(前提)查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,== 【不是纯粹地用到了索引,也不是完全没用到索引】;
Using filesort 是Mysql里一种速度比较慢的外部排序,如果能避免是较好的了,很多时候,我们可以通过优化索引来尽量避免出现Using filesort,从而提高速度,需要(“额外的一次排序”);即使 ORDER BY id 但是有其他的筛选条件,最好是让其走联合索引(二级索引、辅助索引) ;
4、using tempoaray 使用到了临时表
总结:
1、Extra中的为Using index的情况 :
意味着 where筛选列是索引的前导列 &&查询列被索引覆盖 && where筛选条件是一个基于索引前导列的查询,意味着通过索引超找就能直接找到符合条件的数据,并且无须回表 ;
2、Extra中的为空的情况
意味着 查询列存在未被索引覆盖&&where筛选列是索引的前导列,意味着通过索引超找并且通过“回表”来找到未被索引覆盖的字段,
3、Extra中的为Using where Using index:
意味着 是通过索引扫描(或者表扫描)来实现sql语句执行的,即便是索引前导列的索引范围查找也有一点范围扫描的动作,不管是前非索引前导列引起的,还是非索引列查询引起的。
(mysql-相关博客推荐:https://www.cnblogs.com/wy123/category/1019604.html);