每日一套面试题Day22-八股高频(3)
18.HTTP vs. HTTPS 有什么区别?
- 安全性与协议层:
- HTTP是明文传输,数据在客户端和服务器之间像“裸奔”,容易被拦截、窃听和篡改。
- HTTPS通过SSL/TLS协议对传输数据进行加密和身份认证。
- 默认端口:
- HTTP默认使用 80 端口。
- HTTPS默认使用 443 端口。
- 工作流程与性能开销(重点!展现深度):
- HTTP的连接建立非常简单,就是经典的TCP三次握手。
- HTTPS在TCP三次握手之后,还需要进行TLS握手。这个过程涉及非对称加密(例如RSA、ECDSA)来交换密钥、验证证书,最后才会切换到对称加密(例如AES)来传输实际数据。这个握手过程会带来额外的RTT(往返延迟)和CPU计算开销。
- SSL证书:
- HTTPS要求服务器必须拥有一个由可信证书颁发机构(CA) 签发的SSL证书。这个证书的作用是验证服务器的身份,防止中间人攻击。
19.说说 TCP 的三次握手
三次握手=“我能发→你能收→我知道你能收”,两次握手保证不了双方 都 确认通路可用,而四次又可把“确认 + 发起”合并成一次包,因此恰好三次最经济;
20.如何评估 / 判断索引是否生效?常见索引失效场景有哪些?
评估索引是否生效需“三看”:看执行计划是否命中索引(EXPLAIN)、看扫描行数是否骤降(rows)、看查询耗时是否锐减(性能监控);
失效:
- 索引列用函数/参与计算
- 最左前缀原则
- LIKE以通配符 % 开头
- 使用 OR 连接条件,如果 OR 连接的条件中有一个列没有索引,那么整个查询可能无法使用索引。
- 使用 NOT IN, <>, != 操作符 这些否定操作符通常难以利用索引,因为它们代表的是一个非常大的范围,数据库倾向于全表扫描。
21.如何利用Redis实现一个分布式锁?
- 基础版
- 加锁:使用SET命令,Key为锁的唯一标识,Value为一个唯一字符串(防止误删),并设置过期时间。
- 解锁:使用Lua脚本,先比较当前锁的Value是否与传入的Value相等,相等则删除,保证原子性。 注意:唯一Value可以使用UUID,确保每个锁的持有者只能释放自己的锁。
- RedLock 当系统对一致性要求极高,或者Redis是主从架构时,基础版本可能不够安全。这时可以使用Redis官方推荐的 Redlock 算法。 释放锁的操作和在单节点上释放锁的操作一样,只要执行释放锁的 Lua 脚本就可以了。 释放锁的操作和在单节点上释放锁的操作一样,只要执行释放锁的 Lua 脚本就可以了。
22.SQL 调优常见方法有哪些?
我的博客详解 先监控发现慢SQL,然后通过EXPLAIN分析执行计划,接着从索引和SQL语句本身这两个成本最低的方面入手进行优化。如果这些手段都达到了瓶颈,最后才会考虑读写分离、分库分表等架构层面的方案
#面试真题#每日一套面试真题 文章被收录于专栏
记录刷过的面试真题