1.redis缓存穿透和缓存雪崩了解么?怎么解决的
- 缓存穿透
- 缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库。
- 解决方式:
- 做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。
- 把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话再去进行后续操作.
- 缓存雪崩
- 缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求。
- 有一些被大量访问数据(热点缓存)在某一时刻大面积失效,导致对应的请求直接落到了数据库上。
解决方式
一是要看你的业务类型,二是不能用MYSQL的思路来建MONGO(一个是表,一个是文档)
- 适用场景不同,一般对事务性要求不强的领域,比较适合MongoDB。如果对一系列增删改有强制事务原子性要求,那显然要数据库支持事务回滚的啊,还是MySQL吧。
- mongo数据容易丢失
-
4.数据库是怎么优化的?
分库分表
- 加索引
- 设计表的时候,添加冗余字段
其他规范一般情况都满足,所以我们大部分优化都是通过修改sql完成的
对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引
- 对于使用 like 查询, 查询如果是 ‘%aaa’ 不会使用索引,而 ‘aaa%’ 会使用到索引
- 如果条件中有 or, 有条件没有使用索引,即使其中有条件带索引也不会使用,换言之, 就是要求使用的所有字段,都必须单独使用时能使用索引。
- 如果列类型是字符串,那么一定要在条件中使用引号引用起来,否则不使用索引。
如果mysql认为全表扫面要比使用索引快,则不使用索引。如:表里只有一条数据。
6.线程池拒绝策略
丢弃任务并抛出异常
- 丢弃任务,但不抛出异常
- 丢弃队列最前面的的任务,然后重新提交被拒绝的任务
- 由调用线程(提交任务的线程)处理该任务
7.Restful
8.springmvc有什么好处?
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:只在键已经存在时,才对键进行设置操作
-
13.熔断器的几种状态
14.事务隔离级别描述
15.消息中间件的作用?
消息中间件,就是一种系统,它自己本身也是独立部署的,通过消息的收发,是多个系统之间不局限于同步调用,通过异步调用更好地实现解耦
16.生产环境中遇到过cpu飚高的问题么?什么原因会产生cpu飚高?怎么解决呢?
首先cpu飚高问题是怎么产生的
- 代码里可能会写一写Cas循环,不断去重试,占用资源
- 代码出现死循环bug问题,并且无法自己退出.会产生cpu空转的问题
- 云服务器被黑,挖矿
- 服务器被黑客攻击,不断进行模拟请求去做dos攻击
- 怎么解决