场景题总结-4
1.如何设计一个分布式的流控组件可以使用redis结合lua脚本的原子性去实现采取令牌桶算法作为限流方式redis存储桶容量、当前token数量、token生成速率和上一次更新时间每次有请求的时候就使用lua脚本判断当前token数目、然后扣减并返回结果。2.高并发系统设计首先是使用消息队列对任务进行缓存使用分库分表的方式降低压力使用rpc通信避免一个节点解决过多的问题另外还有读写分离使用多个节点主写从读使用缓存。3.怎么设计redis缓存首先是考虑redis读写策略读命中就直接返回否则先从数据库读再更新缓存写策略就直接写数据库然后使得缓存数据失效可以使用延迟双删策略。然后是淘汰策略可以使用近似的LRU算法每次淘汰的时候随机采样然后淘汰最久远的。最后是要考虑异常处理要处理缓存穿透、击穿和雪崩的问题可以使用记录零值、布隆过滤器解决缓存穿透问题缓存击穿是热点数据失效导致大量请求到达数据库可以使用互斥锁的方式去访问、热点key不失效缓存雪崩是大量key同时过期可以使用多级缓存或者对于过期时间增加随机过期时间。4.怎么排查慢sql语句首先开启慢查询日志定位慢查询的sql语句然后使用EXPLAIN查看执行计划判断是否使用了索引、扫描的行数如果没有合适的索引就建立合适的索引如果有索引要检查是否发生了索引失效的情况比如是否函数、列计算、最左前缀匹配失效、隐式的类型转换如果出现了这些情况就首先去修改sql语句利用索引。如果能使用覆盖索引避免回表就利用然后如果是select*就改成具体的列select具体的列名。在修改完成之后就使用压测然后重新查看执行计划检查。总结排查问题的思路主要是定位问题考察多个问题然后修改设计分布式系统主要是考虑使用中间件使用拆分任务的思路比如海量数据处理。分布式限流主要是因为个人项目才会问到排查慢sql、高并发系统是比较通用的问题。消息队列这些还有比如手撕一个消息队列这种拓展问题主要就是要在保证有效实现的情况下不要锁太久。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →