1.怎么设计一个分布式限流器
使用 Redis,采用令牌桶算法,在 Redis 中存储桶容量,当前 token 数,令牌生成速率以及上次更新时间,每次有需要访问的时候就使用 lua 脚本判断当前 token 数目,如果满足就扣减。
2.redis 作为缓存怎么设计
从读写策略淘汰策略和异常处理三个角度去考虑。
如果读命中就直接返回,如果不命中就读数据库内容并更新缓存,写策略采用直接写数据库使缓存失效的方法,可以采用延迟双删保证一致性。
淘汰策略可以使用近似 LRU 算法,对于每个记录保存一个增加的数值作为时间,容量满之后采样并淘汰数值最小的。
要坐缓存穿透 缓存击穿和雪崩三个角度去处理异常,缓存穿透是需要记录不存在的值或者使用布隆过滤器解决,缓存击穿通过使用互斥锁解决,缓存雪崩可以通过多级缓存或者对于过期时间增加随机值解决。
3.慢查询如何优化
首先开启慢查询日志定位慢速度的 SQL 语句,然后使用 explain 查看执行计划,判断是否使用了索引,索引的行数 类型等。
如果没有使用索引,没有合适的索引要建合适的索引,如果有合适的索引要看是否有索引失效的场景,比如没有符合最左前缀匹配原则,索引函数 列计算或者隐式类型变换,然后去修改避免索引失效。
要避免对不要的列的查询避免 select*,能用覆盖索引的就不用回表查询。
最终通过压测或者查看执行计划验证。
八股
1.一次 URL 访问的过程是什么
首先要对 URL 解析,如果不是符合的 url 就直接搜索,如果是的话要对域名解析,查找本地浏览器的缓存和操作系统缓存是否有对应的 ip ,如果不存在,则本地域名服务器会依次去询问根域名服务器,顶级域名服务器权威域名服务器查找对应的映射,最终存储下来。
在获得 ip 地址之后通过 tcp 的三次握手建立连接,如果是 https 协议还要建立 tls 连接,之后客户端发送 http 请求,服务器解析并响应,对于响应都结果浏览器进行解析并展现给用户。
2.TCP&UDP 的区别
TCP 和 UDP 都是传输层协议,TCP是有连接协议,在传输数据之前需要三次握手建立连接,传输数据之后需要四次挥手释放连接,UDP 没有。TCP 是面向字节流的,UDP 是面向包的,TCP 是可靠的,有重传和流量控制拥塞控制机制,UDP 没有。
粘包和拆包是什么意思,怎么解决?
粘包和拆包是 TCP 协议传输中遇到的问题,分别代表多个应用层协议一次被接收和一个信息被分成多次接收,解决方法可以在应用层增加信息长度字段,使用特殊的字符表示结束,或者使用固定长度的信息。
3.TCP 连接体现在哪些地方
首先是 TCP 传输数据前后的三次握手和四次挥手,
其次是 TCP 的快速重传和超时重传机制,TCP 对于传输有发送序号和确认的机制,TCP 有流量控制机制和拥塞控制机制避免数据拥塞或者接收方溢出过多。TCP 会缓存非按序到达的字节流。