个人技术栈

目前知识列出了个人的技术栈包含的内容,后续慢慢补充文章

1java基础

1.1集合

1.1.1Arrays.sort实现原理

comparable&Comparator的区别

对于需要排序的集合或者数组不是单纯数字型时,通常可以使用comparator或者comparble,以简单的方式实现对象排序或者自定义排序。

Comparator强行对某个对象collection进行整体排序的比较函数,可以将comparator传递给collections.sort。一个类实现了Comparatable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的结合就可以直接使用sort方法排序。

Java 6中使用的是mergeSort,而在java 7中,内部实现换成TimSort,而对对象间比较的实现要求更加严格。

Timsort属于稳定的排序算法,最大的特点是充分利用数组中已经存在的顺序。

1.1.2foreach&while

foreach依赖Ienumerable ,for依靠下标定位。在固定长度或者长度不需要计算的时候for效率高;在不确定长度或计算有性能损耗的时候用foreach;使用foreach会锁定集合中的对象,期间不能修改。

1.1.3arrayList & LinkedList

1.1.4hashMap/hashtable

1.1.5treemap

1.2Math及double\float精度问题

采用BigDecimal(String val)

1.3动态代理

都实现了map接口,主要区别线程安全性、同步(synchoronization)、速度。现在多线程可以采用ConcurrentHashMap,其采用锁分段技术

HashMap的迭代器为Iterator,HashTable的迭代器是Enumerator不是fail-fast,当有其他线程改变hashMap的结构(增加或者移除元素)会抛出ConcurrentModificationException

Map.Entry\Bucket

hashing的概念

HashMap中解决碰撞的方法,hashCode返回相同出现碰撞,尽量使用String、int不可变类

equals和hashCode的应用及其重要性

不可变对象的好处

HashMap多线程的条件竞争

重新调整HashMap的大小

参考文章www.importnew.com/7099.html

1.4反射

1.5cloneable原理,深拷贝or浅拷贝

1.6java NIO使用

netty\mina

1.7线程池

1.种类及其区别

2.使用场景

3.实现原理和线程调度过程

4.如何优化、调优

5.最大线程数目根据什么调整

1.8锁,ReentrantLock

mutex互斥

悲观锁、乐观锁

2算法&数据结构&设计模式

2.1海量URL去重问题(布隆过滤器)

2.2数组和链表数据结构描述及其时间复杂度

2.3二叉树遍历

2.4快速排序

3JVM

3.1内存模型

3.2GC

4JUC、并发相关

4.1Volitle

4.2CAS

4.3threadlocal的原理、作用,使用注意

ThreadLocal线程变量副本,在Spring中管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都有出现。

4.4ThreadPoolExecutor

4.5synchronized和lock的区别

4.6concurrenthashMap

4.7Fork/Join框架及其实现原理

5Spring

5.1AOP与IOC的实现原理

5.2MVC的原理

1.controller是单例还是多例?如何保证并发的安全。

5.3BeanFactory&FactoryBean的区别

5.4cglib如何实现对接口的实现进行代理

5.5事务的传播、隔离级别,实现原理

5.6ThreadLocal在spring中的应用

5.7Mybatis的底层实现

5.8Spring-boot的特性、优势及其适用场景

5.9spring-cloud

配置、熔断、路由等

5.10spring-security

5.11spring-session

5.12quartz&timer的对比

6分布式

6.1理论&原理

6.1.1一致性、2PC、3PC

一致性:相互独立的节点之间如何达成一项决议的问题。常见的一致性问题:数据库事务提交、leader选举、序列号生成等

一致性需要满足的条件:agreement全认同;validity值合法;termination可结束;asynchronous消息传递异步无序;fail-stop节点宕机;fail-recover节点宕机恢复;network-partition网络分化,网络出现问题,将N个节点隔离成多个部分;byzntine failure拜占庭将军问题,不按套路出牌抛出干扰决议的信息。

6.1.2选举、多数派和租约

election选举是分布式系统实践中常见的问题,通过打破节点之间的对等关系,选的leader(Master\cordinator)有助于实现事务的原子性、提升决议效率。

多数派quorum是在网络分化的情况下达成决议一致性,在leader选举的场景下帮助我们选出唯一的leader。

租约(lease)在一定期限内给予节点特定权利,也可以实现leader选举,保证在一个时刻最多只有一个leader。为了避免在选举的时候只使用心跳机制会由于网络拥塞或者瞬断出现双主的问题。lease最初提出用于解决分布式缓存一致性问题,后在分布式锁等多方面都有引用

选举bully算法

6.1.3CAP

consistency数据一致性;所有的读都读取到最新的数据,又称为原子性atomic、线性一致性linearizable。

availability服务可用性;所有读写请求在一定时间内得到响应,可终止、不会一直等待

partition-tolerance分区容错性;在网络分区的情况下,被分隔的节点仍能正常对外服务

6.1.4一致性协议

paxos、raft、ZAB

Raft将问题分解和具体化,leader统一处理变更操作请求,一致性协议的作用具化为保证节点操作日志副本(log replication)一致,以term作为逻辑时钟保证时序,节点运行相同状态机得到一致结果。

ZAB zookerper的内部用到的一致性协议,保证强一致性。

6.1.5paxos算法及其协议

paxos协议在节点宕机、消息无序或丢失、网络分化的场景下保证决议的一致性协议。

将节点分为两类,proposer申请人、提案人,参与决议的为acceptor。learner、leader

6.2消息(适用场景、有哪些消息组件、消息丢失问题)

1.适用场景

2.都有哪些MQ,区别是什么

3.如何保证数据不丢失

4.MQ的连接是线程安全的吗?

6.3RMI

6.4RPC

6.5传输

6.6路由

6.7存储

6.8缓存

memcached ehcachedredis

6.9接口幂等性

6.10熔断、降级等机制

6.11dubbo

6.11.1应用场景

6.11.2底层实现原理和机制

6.12zookeeper

分布式协调技术。

1.数据模型Znode

2.适用场景

分布式锁服务、配置维护、组服务、分布式消息队列、分布式通知/协调

3.原理

4.watch机制

6.13数据的垂直拆分、水平拆分。

1.数据库的分库分表策略

2.如何解决全表查询问题

6.14redis

1.并发竞争如何解决?

2.Redis事务的CAS

3.缓存穿透的解决办法

6.15分布式锁

6.16分布式事务

7数据库

7.1mysql的引擎

myISAM索引方式为非聚集

innoDB

区别:

MyISAM的索引文件和数据文件是分离的,索引文件保存数据记录的地址。InnoDB中标数据文件本身就是按照B+tree组织的索引结构,在叶节点data保存了完整的数据记录,索引的key就是主键。所以MyISAM可以无主键innoDB必须有主键。

与MYISAM索引不同的是INNODB辅助索引data域存储相应记录主键的值而不是地址,所以检索需要两遍索引。因为所有辅助索引都引用主索引,过长的主索引令辅助索引变得过大。另外使用非单调的主键会造成插入新纪录的数据文件为了维持B+tree的特性而频繁的分裂调整。

7.2innoDB的文件结构

7.3索引(索引树的维护、符合索引)

索引是帮助MYSQL高效获取数据的数据结构。索引的数据结构,常用的B+tree,每个叶子节点不但存放了索引键的相关信息还添加了相邻叶子节点的指针。

B-tree/B+tree

主存存取原理(通过随机读写RAM,通过地址总线与数据总线读写,不存在机械操作)

磁盘存取原理(磁盘IO存在机械运动损耗)

局部性原理与预读(或读取一页或多页【4k】的数据到主存)

详见:http://blog.jobbole.com/24006

myISAM与innoDB都采用B+tree的索引数据结构,但是实现不相同。

7.4mysql的优化

MYSql的优化分为结构优化和查询优化。必须做好4项工作:数据库设计、sql语句优化、数据库参数配置、恰当的硬件资源和操作系统。

结构优化中高性能索引策略

explain查看时cardinality索引基数

select_type simple不包括union或子查询;primary一个需要union或者包含子查询的select。

type查询使用的类型,type=const表示通过索引一次就找到了;type=all表示为全表索引;type=rel认为多个匹配行,联合索引。顺序:

system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL一般来说至少range最好是ref

possible_keys使用哪个索引找到的行如果为空,则没有相关的索引

key显示使用的键,如果没有索引为nul.key=primary表示使用了主键;key=null表示没有用到索引

key_len显示使用键的长度

rows遍历了多少行找到的,但是innodb不准确

extra only index意味只用到索引树。where

used使用上了where限制。impossible where标识用不着where,一般就是没有查询出什么来。

1.最左前缀原理

7.5高并发如何安全的修改同一行数据?乐观锁、悲观锁?行级别的锁有哪几种?

7.6慢查询日志

配置my.ini

long_query_time=1

log-show-queries=路径

7.7Semi-sync & group

replication

7.8主从复制

8大数据相关

8.1hadoop

8.2hive、Hbase

8.3storm、spark

8.4kafka

9应用服务器

10工具&opts

10.1git

10.2mock

10.3jenkins

10.4Cat日志监控

10.5postman或者RAP

10.6灰度

10.7docker/kubernetes

10.8linux

推荐阅读更多精彩内容