分布式
1.分布式事务解决方案?
①TCC补偿性事务
②saga
③基于MQ的事务异步确保型,需要业务系统结合MQ消息中间件实现,在实现过程中需要保证消息的成功发送及成功消费。即需要通过业务系统控制MQ的消息状态
④最大努力通知型,这种方案主要用在与第三方系统通讯时,比如:调用微信或支付宝支付后的支付结果通知。达到通知次数后即不再通知。
⑤2PC
⑥3PC
2.redis 热key如何解决?
①利用jvm堆内缓存,如HashMap等
②通过集群分担负载。
3.什么是缓存穿透,如何解决?
缓存穿透是指查询一个缓存和数据库都不存在的数据,造成数据库压力增大
解决方案:
①缓存空对象.将 null变成一个特定值.②布隆过滤
4.常用的限流算法有哪些?
①令牌桶②漏桶③滑动窗口④计数器
5.聊聊web集群与高可用方案?
集群主要考虑session解决方案:
①基于Cookie的Session共享。把session加密后存在cookie中,每次session信息被写在客服端.然后经浏览器再次提交到服务器
②提供一个群集保存session共享信息。应用统统把自己的session信息存放到session群集服务器组.当应用系统需要session信息的时候直接到session群集服务器上读取。
③同步session。利用服务器资深功能进行session复制,达到每个服务器上的都有相同的session。
高可用主要考虑使用:
keepalived, haproxy,lvs.nginx等软件实现主备切换⑤异地多活
协议
1.现代浏览器在与服务器建立了—个TCP连接后是否会在一个HTTP请求完成后断开?
①默认情况下建立TCP连接不会断开,只有在请求报头中声明Connection: close 才会在请求完成后关闭连接;②但需注意早期的HTTP1.0协议规定是要断开,而服务器供应商一般都是支持不断开
2.TCP两端A、B建立了连接后,如果一端拔掉网线或者拔掉电源,另一端能够收到通知吗,如何解决?
不能,原因如下;
①TCP是一种有连接的协议,但是这个连接并不是指有一条实际的电路,而是一种虚拟的电路。TCP两端的操作系统用一种数据结构保存了数据的状态,就代表这种连接,因此如果不发送数据通知对方删除这种数据状态,是无法断开连接的。解决方案:
②TCP本身的KEEP_ALIVE
③应用层心跳
Mysql数据库
1.举例说明什么是最左前缀原则?
当创建(a,b.c)复合索引时,想要索引生效的话,只能使用a和a,b和a,b,c三种组合
2.什么是覆盖索引?
select的数据列仅从索引中就能够取得并且不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
例子:如以country表a(表示城市).b(表示省)两列做复合索引, select a from country where b='浙江省'
3.Mysql高可用方案有那些?
①双节点主从+ keepalived/heartbeat
②多节点主从+MHA
③基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster(简称PXC)
4.一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录?
①如果A表TID是自增长.,并且是连续的,B表的ID为索引select * from a,b where a.tid = b.id and a.tid>500000limit 200;
②如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主健,要么是辅助索引,B表ID也需要有索引。
select * from b , (select tid from a limit 50000,200) awhere b.id = a .tid;
5.简述mysql主从复制过程?
- ①主节点binary log dump 线程
当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。
- ②从节点I/O线程
当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。1/O线程接收到主节点binlog dump进程发来的更新之后,保存在本地relay-log中。
- ③从节点SQL线程
SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。