mysql&redis面经

mysql&redis面经

Posted by 敬方 on April 1, 2024

mysql 面经

说一说索引失效

  1. 查询条件包含or,可能导致索引失效
  2. 如果字段类型是字符串,where时一定用引号括起来,否则索引失效
  3. like通配符可能导致索引失效。
  4. 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
  5. 在索引列上使用mysql的内置函数,索引失效。
  6. 对索引列运算(如,+、-、*、/),索引失效。
  7. 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
  8. 索引字段上使用is null, is not null,可能导致索引失效。
  9. 左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
  10. mysql估计使用全表扫描要比使用索引快,则不使用索引。

redis面经

简单聊聊缓存雪崩、穿透、击穿

  • 缓存雪崩:核心缓存在同一时间点,大量过期失效,导致请求直接到数据库,导致数据库崩溃
    • 解决方法:
      • 过期时间随机:结合业务情况,随机设置过期时间,避免大量数据同一时间过期
      • 互斥加锁(限流):使用锁机制避免并发请求,会导致吞吐量明显下降
      • 不设置过期:热点数据不设置过期,存在数据更新先删除再加载
  • 缓存击穿:缓存击穿是指一个热点 key 过期或被删除后,导致线上原本能命中该热点 key 的请求,瞬间大量地打到数据库上,最终导致数据库被击垮。
    • 解决方法:
      • 梳理逻辑:找到热点数据击穿业务原因,重新明确流程,保证核心功能与流程
      • 加强管理:避免热点数据被删除
  • 缓存穿透:客户端请求缓存和数据库中不存在的数据,导致所有的请求都打到数据库上。如果请求很多,数据库依旧会挂得明明白白。
    • 解决方法:
      • 参数校验:做好业务参数校验,避免直接访问数据库
      • 数据缓存:对访问的数据,及时放入缓存中。减轻数据库压力
      • 拦截限流:判断请求是否有效,降低访问缓存和数据的频率
  • 业务可靠性处理:redis 缓存可用性
    • 解决方法:
      • 主从结构:使用redis主从+ 哨兵 或者redis集群架构。保证redis的可用性
      • 降低缓存依赖:结合业务场景,考虑本地缓存,降低redis压力
      • 业务降级:从保护下游的角度考虑,大流量下进行限流与服务降级,避免拖垮下游服务。