1.场景题目
a.关于缓存击穿、雪崩和穿透的概念以及对应的解决方法
缓存击穿是指访问的热点 key 失效导致大量请求直接达到数据库。
解决方法是热点 key 永不失效,或者给数据库加上互斥锁只有第一个请求实际访问数据库。
缓存雪崩是指大量 key 失效,导致大量请求直接达到数据库。解决方法是一种是设置不同 key 不同的失效时间,另外可以使用多级缓存。
缓存穿透是指因为访问大量数据库中也不存在的数据,缓存中更不可能有,于是直接去访问数据库。解决方法可以记录不存在的 key,另一种是使用布隆过滤器。
b.MySQL 的查询优化器没有使用期望的索引,或者很慢
解决方法
首先可以用 forge 强制使用索引、其次对 SQL 语句重写,比如有覆盖索引的 where、建立合适的索引比如联合索引
在排查的时候也要排查是不是索引失效
c.接口设计的原则
首先是规范,输入和输出最好统一类型比如 JSON
安全性要考虑不要把能直接访问内部的接口暴露
性能要考量,比如使用缓存和异步的方式
记录日志
d.Redis 的 key 和 value 设计的原则
首先是都是不要过大,浪费资源
对于 key 要直观好理解
value 是要选择合适的数据结构
e.复杂架构设计要分层的原因
职责分离,比如前后端分离
解耦合,提高系统的扩展性,每一层只依赖于他前面的层而且不用关心具体实现
2.Redis 集群
a.哨兵机制
哨兵解决的问题是判断主库是否下线了是否需要选新的主库、选新主库、选完之后通知的问题。
为什么需要集群?
因为哨兵判断主库下线有一个错判断的可能是网络问题导致没有收到响应,如果直接进行主从切换会有同步、建立连接的过程,如果主库本身没有下线这是一种浪费。
b.判断下线和选新的主库都是少数服从多数的原则
当多数判断主库下线,就把主库从主观下线变成客观下线。
实际执行选主库的操作的哨兵也是通过少数服从多数选出来。
c.哨兵集群的建立
多个哨兵通过在主库发布自己的信息,其他哨兵注册互相通知对方的 IP 和端口等。pub 和 sub
哨兵通过 info 命令获得主库连接的从库的信息。
哨兵获得客户端信息也是通过在主库 pub 和 sub,客户端通过订阅哨兵信息来获得关于主从库切换的具体信息。
3.总结
项目中经常被问到的数据库相关的很多都是索引相关的,查询速度慢?索引设计问题、索引失效问题、语句问题,b+树为什么?也是为了索引,归根到底数据库就是存储数据,索引数据然后用来被检索。
Redis 单机的知识主要是解决高可靠里的数据持久性,对于真实的 Redis 高可靠还有在分布式世界里的服务不中断,这就是主从库解决的问题,哨兵机制使得主从库能够顺利的进行。