架构师必备理论知识

原创
08/22 00:12
阅读数 0

一、乐观锁、悲观锁区别和应用场景

乐观锁:
    乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。(通过 CAS和版本号实现)

悲观锁:
    悲观锁在操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。(通过synchronized)

适用场景:
    1、CAS只能保证单个变量操作的原子性,当涉及到多个变量时,CAS是无能为力的,而悲观锁(synchronized)则可以通过对整个代码块加锁来处理。
    2、当竞争不激烈 (出现并发冲突的概率小)时,乐观锁更有优势;当竞争激烈(出现并发冲突的概率大)时,悲观锁更有优势

二、死锁产生的必要条件?如何避免死锁?

条件
	1、互斥条件
	2、不剥夺条件
	3、请求和保持条件
	4、循环等待条件
主要原因
	1.因为系统资源不足。
	2.进程运行推进的顺序不合适。
	3.资源分配不当等。
避免
	1、加锁顺序(线程按照一定的顺序加锁)
	2、加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
	3、死锁检测

死锁检测
	1、Jstack命令
	2、JConsole工具

三、事务隔离级别

串行化(顺序)、可重复读(类拟XXX for update)、读已提交数据、读未提交的数据

四、MYSQL查询长时间优化

1、选取最适用的字段属性
2、使用连接(JOIN)来代替子查询(Sub-Queries)
3、使用联合(UNION)来代替手动创建的临时表
4、使用索引(使用EXPLAIN来查询,索引是否命中)
5、尽量使用其它形式来代替Like关键字
6、字符串用引号
7、数据比较时采用相同类型的列以提高查询效率

MYSQL存储引擎
	MYISAM、INNODB、memory、merge

数据库索引如何知道命中?
    索引验证字段使用:EXPLAIN 来查询,例如:EXPLAIN select * from admin where name="XXX"

五、缓存刷新和分布式同步

1、缓冲区的模式(程序读缓存数据,命中就从缓存中取,取不到就从数据库取;数据更新到数据库后再让缓存失效)
2、通读模式(只读缓存数据;更新时只写到数据库,然后由缓存自已更新[定时或其它策略])
3、通写模式(只读缓存数据;更新时当没有命中缓存时直接写数据库;命中缓存则写缓存,然后再由缓存自己更新数据库)
4、回写模式(只读缓存数据;更新时只写缓存不写数据库,数据由缓存异步批量更新到数据库)

高并发可以使用版本来解决数据一致性问题,更新前先把数据读出来,更新时带上版本号,当版本号一致则更新成功,版本号不一致更新失败(例:update table set name = 'tiger', version = version + 1 where id = #{id} and version = #{version})。或者分布式锁(比较消耗性能)

分布式数据同步
    1、主从复制(数据冗余、故障恢复、负载均衡)
  全量复制(生成快照发送给从节点,从节点收到rdb文件后将文件恢复到内存中)
  命令传播(所谓命令传播当Master节点每处理完一个命令都会把命令广播给所有的子节点,而每个子节点接收到Master的广播过来的命令后,会在处理完之后继续广播给自己的子节点)
    2、哨兵模式(当主数据库挂了,可以通过哨兵监控,将从服务器转化为主服务器。哨兵之间也可以互相监控。)
    3、集群(Cluster)模式
   对数据进行服务端切片(客户端切片一般指,不同的客户端根据需要连接不同的redis数据库:客户端分区、代理分区、查询路由),redis集群有16384个哈希槽(分区)

六、服务限流常用的算法

1、并发计数器
2、漏桶算法
3、令牌算法(支持突发限流,guava,sentinel限流中间件)

七、Spring 优点

1、低侵入式设计:非入侵式设计,基于Spring开发的应用一般不依赖于Spring的类
2、独立于各种应用服务器,真正实现:一次编写,到处运行。
3、Spring的依赖注入特性使Bean与Bean之间的依赖关系变的完全透明,降低了耦合度:使用SpringIOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑。
4、它的面向切面编程(AOP)特性允许将一些通用任务如安全、事务、日志等进行集中式处理。
5、并且它还提供了与第三方持久层框架的良好整合,并简化了底层数据库访问。
6、高度的开放性(可以和Struts2、Hibernate、MyBatis、CXF等很多主流第三方框架无缝整合)

八、Springmvc的核心是什么?springMVC实现控制反转

核心
    springmvc是基于Servlet的前端控制框架,两大核心技术是IOC(Dependency Injection依赖注入,Inversion of Control控制反转)和AOP(Aspect Oriented Programming切面)编程思想;Spring三个核心组件(Core、Context、Beans),Beans最为核心

控制反转(将调用的对象的控制权从代码本身转移到Spring容器,由配置文件管理)
    常规流程的控制,程序相互的调用由代码控制,springmvc是通过配置文件管理,通过注解依赖注入,实现控制反转(非代码控制);

九、微服务特点、优点

特点
	解耦、组件化、业务能力、自治、持续交付、责任、分散治理、敏捷

优点
	独立开发、独立布暑、故障隔离、混合技术栈、粒度缩放

十、nginx实现tomcat负载均衡

通过配置Nginx的upstream tomcatserver增加tomcat服务器列表
(通过轮询、指定权重、IP哈希、转发给最小链接、fair、url_hash等均衡方式)

负载均衡用户session共享
	1、使用cookie,把session加密数据存cookie中。
	2、session存在数据库
	3、session存在缓存中(如:memcache或者redis)
	4、nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端
	5、upstream_hash,用的url_hash把同一url的访问定向到同一台后端

十一、数据库分库分表原则

1、垂直切分(纵向切分),强调的是业务的拆分。一个数据库由多个表构成,每个表对应不同的业务,那么我们可以指按照业务的不同将表进行分类,并将其分布到不同的数据库上,这样就将数据分摊到了不同的库上面,做到专库专用。

2、水平切分(横向切分),强调的是技术层面的拆分。她是将其按照一定的逻辑规则将一个表中的数据分散到多个库中,在每个表中包含一部分数据,所有表加起来就是全量的数据。

分库原则
	能不切分尽量不要切分;如果要切分一定要选择合适的切分规则,提前规划好;数据切分尽量通过数据冗余或表分组来降低跨库 Join 的可能;由于数据库中间件对数据 Join 实现的优劣难以把握,而且实现高性能难度极大,业务读取尽量少使用多表 Join。
	采用Hash算法分库,解决库分布均衡问题
   
数据库中间件
	MyCat、DBProxy、Oceanus、sharding-JDBC、Cobar-client

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部