1.redis缓存穿透和缓存雪崩了解么?怎么解决的

  • 缓存穿透
    • 缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库。
  • 解决方式:
    • 做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。
    • 把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话再去进行后续操作.
  • 缓存雪崩
    • 缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求。
    • 有一些被大量访问数据(热点缓存)在某一时刻大面积失效,导致对应的请求直接落到了数据库上。
  • 解决方式

    • 采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。
    • 限流,避免同时处理大量的请求。

      2.为什么使用分布式?分布式与集群是不是同一回事?

      image.png

      3.Mongo能不能取代Mysql?

  • 一是要看你的业务类型,二是不能用MYSQL的思路来建MONGO(一个是表,一个是文档)

  • 适用场景不同,一般对事务性要求不强的领域,比较适合MongoDB。如果对一系列增删改有强制事务原子性要求,那显然要数据库支持事务回滚的啊,还是MySQL吧。
  • mongo数据容易丢失
  • 如果有多表联合查询基本就不可以使用 MongoDB 了

    4.数据库是怎么优化的?

  • 分库分表

  • 加索引
  • 设计表的时候,添加冗余字段
  • 其他规范一般情况都满足,所以我们大部分优化都是通过修改sql完成的

    • 建议使用预编译的方式对数据库进行操作
    • 避免数据类型的隐式转换
    • 充分利用已经存在的索引
    • 不可以跨库查询
    • 不使用select * 用 select 字段
    • 禁止使用不带字段的insert语句
    • 避免使用子查询,换成join
    • 尽量不要使用or,用in替换
    • 复杂sql转换成多个简单的sql

      5.索引什么时候会失效

  • 对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引

image.png

  • 对于使用 like 查询, 查询如果是 ‘%aaa’ 不会使用索引,而 ‘aaa%’ 会使用到索引
  • 如果条件中有 or, 有条件没有使用索引,即使其中有条件带索引也不会使用,换言之, 就是要求使用的所有字段,都必须单独使用时能使用索引。
  • 如果列类型是字符串,那么一定要在条件中使用引号引用起来,否则不使用索引。
  • 如果mysql认为全表扫面要比使用索引快,则不使用索引。如:表里只有一条数据。

    6.线程池拒绝策略

  • 丢弃任务并抛出异常

  • 丢弃任务,但不抛出异常
  • 丢弃队列最前面的的任务,然后重新提交被拒绝的任务
  • 由调用线程(提交任务的线程)处理该任务

7.Restful

image.png

8.springmvc有什么好处?

image.png

9.Redis主从复制原理

10.springcloud核心组件

11.最左原则? (如何选择索引列的顺序)

建立索引的目的是:希望通过索引进行数据查找,减少随机 IO,增加查询性能 ,索引能过滤出越少的数据,则从磁盘中读入的数据也就越少。

  • 区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数)
  • 尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大,IO 性能也就越好)
  • 使用最频繁的列放到联合索引的左侧(这样可以比较少的建立一些索引)

    12.怎么用Redis实现分布式锁?

    SET key value [EX seconds] [PX milliseconds] [NX|XX]

  • EX second :设置键的过期时间为second秒

  • PX millisecond :设置键的过期时间为millisecond毫秒
  • NX :只在键不存在时,才对键进行设置操作
  • XX:只在键已经存在时,才对键进行设置操作
  • SET操作成功完成时,返回OK ,否则返回nil

    13.熔断器的几种状态

    关闭(正常情况) -> 打开状态(出问题) -> 半开状态

    14.事务隔离级别描述

    image.png

    15.消息中间件的作用?

    消息中间件,就是一种系统,它自己本身也是独立部署的,通过消息的收发,是多个系统之间不局限于同步调用,通过异步调用更好地实现解耦
    image.png

    16.生产环境中遇到过cpu飚高的问题么?什么原因会产生cpu飚高?怎么解决呢?

  • 首先cpu飚高问题是怎么产生的

    • 代码里可能会写一写Cas循环,不断去重试,占用资源
    • 代码出现死循环bug问题,并且无法自己退出.会产生cpu空转的问题
    • 云服务器被黑,挖矿
    • 服务器被黑客攻击,不断进行模拟请求去做dos攻击
  • 怎么解决
    • 云服务器会有告警系统,设定一个阈值
    • 在服务端先找到哪个进程cpu使用率较高(top指令),接着去看该进程的哪个线程cpu使用率较高.再通过线程名称搜索代码进行定位,使用多线程时,一定要指定线程名称,方便排查