心之所向,勇往直前!
记录面试中的那些小事。面试题只是一道门,最好还是走进屋里看看。
正文
你是如何保证系统是高可用的(结合自己项目讲解最好,不一定需要行业内很复杂的方案)参考资料
高可用就是减少程序停机的可能性,常用做法是负载均衡 + 集群。
a. nginx负载均衡 + 前后端分离 + Api微服务 + 集群
b. Redis可以启用哨兵模式或者cluster
c. MQ集群
d. 数据库主从
什么情况下会产生死锁
当两个进程同时竞争相同资源时,如在A中获取1号资源后加锁再获取2号资源,同时B先获取2号资源加锁,再去获取1号资源,两者会进入死锁状态。
a. 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用
b. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放
c. 占有申请条件:进程自己已经至少保持一个资源,又请求其他资源,但是这个资源被其他进程占有,而且又不释放自己已经占有的资源
d. 循环等待条件:发生死锁时,必定会形成一个进程——资源的环路。
如何避免死锁的发生?参考资料
a. 尽量让事务按顺序执行。
b. 将大事务拆成多个小事务执行
c. 读写分离
d. 避免编写需要用户交互的事务
什么是乐观锁、悲观锁?参考资料
乐观锁:假设数据一般情况不会造成冲突,通过给数据添加Version列来实现并发控制
悲观锁:数据库锁,具有极强的独占、排他性。比较少用。
- 共享锁:也称读锁,多个事务中只能读不能改
- 排他锁:也称写锁,获取到锁的事务拥有读和写的权限,其他事务不能再获取资源的一切锁
什么是脏读、幻读、不可重复读,如何避免?参考资料
脏读:指一个事务中访问到了另外一个事务未提交的数据,当事务A出现回滚时,事务B的读取到的将是脏数据(被事务A修改过的)
幻读:指一个事务中两次相同的查询,得到的数据量不一致
不可重复读:指一个事务两次相同的查询,得到的结果不一致
你都了解哪些ORM?
Entity Framework,Dapper,NHibernate
你都了解哪些MQ?参考资料
a. ActiveMQ
b. RocketMQ
c. RabbitMQ
d. Kafka
一般什么业务场景下会使用MQ
使用MQ是为了解耦、异步、消峰。
a. 系统只能承受2000人并发,但出秒杀活动时出现5000并发,此时使用队列可让多余的请求等待。
b. 有多个系统需要同时获取相同数据的时候
如何保证MQ的幂等性(不会重复消费)
a. 在写库时先查询一次是否已经存在,存在则Update
b. 如果是Set到Redis中具有天然幂等性
c. 主键唯一
如何保证MQ的可靠性(不会丢失数据) 参考资料
a. 生产阶段:要捕获消息发送错误,并重发消息
b. 储存阶段:数据持久化,集群
c. 消费阶段:确认业务逻辑都完成后再发送确认消息
MQ消息积压如何处理
a. 部分业务可以采取限流操作,减少消息的产生
b. 对Broker进行扩容处理
c. 增加消费端
你都了解哪些数据库?
a. Access:基于Windows的关系型小型数据库。数据量大会出现性能问题
b. Sqlite:开源、轻量级嵌入式数据库、简单配置、无需安装
- 不支持高并发
- 适用数据量小
c. MySql: 关系型、体积小、查询速度快,支持上千万数据量查询
- 不是完全开源免费
d. Sqlserver:功能全面,商业型数据库,Windows Server部署时优先选用
e. Oracle:功能全面,商业型数据库,大型项目/Linux部署优先选用
f. MongoDB:开源、文档型NoSql数据库,查询性能极高,有丰富的社区支持
- 不支持事务
- 占用磁盘
知道数据库索引类型有哪些吗?
a. 聚集索引:聚集索引全表只能有一个,比如主键
b. 非聚集索引:可以有多个
使用索引的优缺点
a. 优点:提升查询速度
b. 缺点:增加维护成本,降低增、删、改速度
你了解过哪些缓存技术?
a. Redis
- 单线程
- 支持多种数据类型:list、set、hash、string、zset
- 支持持久化RDB和AOF两种模式
- 支持事务
b. Memcached
- 多线程
- 支持Key-Value型
- 不支持持久化,可靠性低
- 通过cas命令保证数据一致性
结语
本篇到此结束,如果有任何疑问或者指正,请发表在评论区。