面试题-重点

71、Redis的淘汰策略有哪些?

noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但 DEL 和几个例外)
allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有
空间存放。
allkeys-random: 回收随机的键使得新添加的数据有空间存放。
volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数
据有空间存放。

72、Redis缓存穿透、缓存雪崩、缓存击穿?

缓存穿透:无效 ID,在 redis 缓存中查不到,去查询 DB,造成 DB 压力增大。
解决方法:
1、解决方法 1:布隆过滤器,提供一个很大的 Bit-Map,提供多个 hash 函数,分别对查询参数值【比如 UUID】,进行求 hash,然后分别对多个 hash 结果,在对应位置对比是否全为 1 或者某个位置为 0,一旦有一个位置标识为 0,表示本次查询 UUID,不存在于缓存,再去查询 DB.起到一个再过滤的效果。
2、解决方法 2:把无效的 ID,也在 redis 缓存起来,并设置一个很短的超时时间。
缓存雪崩:缓存同一时间批量失效,导致大量的访问直接访问 DB
解决方法:
在做缓存时候,就做固定失效时间+随机时间段,保证所有的缓存不会同一时间失效
缓存击穿:在缓存失效的时候,会有高并发访问失效的缓存【热点数据】
解决方法:
最简单的解决方法,就是将热点数据设置永不超时!
第二个解决方法:对访问的 Key 加上互斥锁,请求的 Key 如果不存在,则加锁,去数据库取,新请求过来,如果相同 KEy,则暂停 10s 再去缓存取值;如果 Key 不同,则直接去缓存取!

73、Redis单线程还能处理速度那么快?

首先,redis 是单进程单线程的 k-v 内存型可持久化数据库。
单线程还能处理速度很快的原因:
1、redis 操作是基于内存的,内存的读写速度非常快
2、正是由于 redis 的单线程模式,避免了线程上下文切换的损耗
3、redis 采用的 IO 多路复用技术,可以很好的解决多请求并发的问题。 多路代表多请求,复用代表多个请求重复使用同一个线程。

74、为什么Redis的操作是原子性的,怎么保证原子性?

对于 Redis 而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。
Redis 的操作之所以是原子性的,是因为 Redis 是单线程的。
Redis 本身提供的所有 API 都是原子操作,Redis 中的事务其实是要保证批量操作的原子性。
多个命令在并发中也是原子性的吗?
不一定, 将 get 和 set 改成单命令操作,incr 。使用 Redis 的事务,或者使用 Redis+Lua==
的方式实现.

75、Nginx的调度算法有哪些?

1、sticky:通过 nginx-sticky 模块,来实现 cookie 黏贴的方式将来自同一个客户端的请求发
送到同一个后端服务器上处理,这样一定程度上可以解决多个后端服务器的 session 会话同步的问题;
2、round-robin(RR):轮询,每个请求按时间顺序依次分配到不同的后端服务器,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响;
3、weight:轮询权重,weight 的值越大分配到的访问概率就越高,主要用于后端每台服务器性能不均衡的情况下,或者仅仅为在主从的情况下设置不同的权重,达到合理有效的利用主机资源。
4、least_conn:请求被发送到当前活跃连接最少的 realserver 上,会考虑到 weight 的值;
5、ip_hash:每个请求按照 IP 的哈希结果分配,使来自同一个 IP 的访客固定访问后端服务器,可以有效的解决动态网页存在的 session 共享问题。
6、fair:比 weight、ip_hash 更加智能的负载均衡算法,fair 算法可以根据页面的大小和加载
时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,相应时间短的优先分配。nginx 本身不支持 fair,如果需要使用这种调度算法,则必须安装 upstream_fair模块。
7、url_hash:按访问的 URL 的哈希结果来分配请求,使每个 URL 定向到后端服务器,可以进一步提高后端缓存服务器的效率。同样,nginx 本身不支持 url_hash,如果需要这种调度算法,则必须安装 nginx 的 hash 软件包。

76、Nginx负载均衡调度状态

1、down:表示当前的 server 暂时不参与负载均衡;
2、backup:预留的备份机器。当其他所有的非 backup 机器出现故障或者繁忙的时候,才会
请求 backup 机器,因此这台机器的访问压力最低;
3、max_fails:允许请求失败的次数,默认为 1,当超过最大次数时,返回 proxy_next_upstraem
模块定义的错误;
4、fail_timeout:请求失败超时时间,在经历了 max_fails 次失败后,暂停服务的时间。max_fails和 fail_timeout 可以一起使用。

77、为什么要用MQ?

解耦:如果多个模块或者系统中,互相调用很复杂,维护起来比较麻烦,但是这个调用又不是同步调用,就可以运用 MQ 到这个业务中。
2、异步:这个很好理解,比如用户的操作日志的维护,可以不用同步处理,节约响应时间。
3、削峰:在高峰期的时候,系统每秒的请求量达到 5000,那么调用 MySQL 的请求也是5000,一般情况下 MySQL 的请求大概在 2000 左右,那么在高峰期的时候,数据库就被打垮了,那系统就不可用了。此时引入 MQ,在系统 A 前面加个 MQ,用户请求先到 MQ,系统 A 从 MQ 中每秒消费 2000 条数据,这样就把本来 5000 的请求变为 MySQL 可以接受的请求数量了,可以保证系统不挂掉,可以继续提供服务。MQ 里的数据可以慢慢的把它消费掉。

78、如何重新加载SpringBoot上的更改,而无需重新启动服务器?

这可以使用 DEV 工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式 tomcat 将
重新启动。Spring Boot 有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。
Java 开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载 Spring Boot 上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot 在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools 模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供 H2数据库控制台以更好地测试应用程序。

79、Http协议的状态码有哪些?含义是什么?

200 OK 客户端请求成功
301Moved Permanently(永久移除),请求的 URL 已移走。Response 中应该包含一个 Location
URL,说明资源现在所处的位置
302found 重定向
400Bad Request 客户端请求有语法错误,不能被服务器所理解
401Unauthorized 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,eg:输入了错误的 URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

80、TCp和UDP的区别?

1.基于连接与无连接;
2.对系统资源的要求(TCP 较多,UDP 少);
3.UDP 程序结构较简单;
4.流模式与数据报模式 ;
5.TCP 保证数据正确性,UDP 可能丢包,TCP 保证数据顺序,UDP 不保证。