面试之Nginx、Redis篇

1、请解释一下什么是 Nginx?

Nginx(C语言开发)是一个高性能的HTTP和反向代理服务器,也是【轻量级】web服务器,以及电子邮件(IMAP/POP3/SMTP)代理服务器。

2、请列举 Nginx 的一些特性。

  1. 反向代理 、L7负载均衡
  2. 嵌入式Perl解释器;
  3. 动态二进制升级;
  4. 可用于重新编写URL,具有非常好的PCRE支持;

3、请列举 Nginx 和 Apache 之间的不同点。

1.最核心区别在于Apache是同步多进程模型,一个连接对应一个进程; nginx是异步的,多个连接(万级别)可以对应一个进程;
2.nginx的负载能力比Apache高很多。
面试之Nginx、Redis篇_第1张图片

4、使用“反向代理服务器”的优点是什么?

反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当你使用web托管服务时;

5、请解释你如何通过不同于 80 的端口开启 Nginx?

为了通过一个不同的端口开启nginx,你必须进入 /etc/Nginx/sites-enables/ ,如果这是默认文件,那么你必须打开名为 default 的文件。编辑文件,并放置在你想要的端口: Like server{listen 81;}

6、负载均衡描述一下?

负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中,
负载均衡主要解决网络拥堵问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力

7、解释一下正向代理和反向代理

  1. 正向代理:
    一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
    总结: 代理端代理的是
    客户端
  2. 反向代理
    反向代理(reverse proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求发给内部网络上的服务器,
    并将服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
    总结:代理端代理的是服务端

8、为什么不使用多线程?为什么 Nginx 性能这么高?

Apache:
创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源;
Nginx:
采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的cpu的上下文切换。所以才使得nginx支持更高的并发;
异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

9、为什么要用 Nginx?

优点:

  1. 跨平台、配置简单
  2. 非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发;
  3. 内存消耗小:开启10个nginx才占150M内存,nginx采取了分阶段资源分配技术
  4. nginx处理静态文件好,耗费内存少;
  5. 内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其它的节点上。
  6. 节省宽带: 支持GZIP压缩,可以添加浏览器本地缓存;
  7. 稳定性高:宕机概率非常小
  8. master/worker结构:一个master进程,生成一个或多个worker进程;
  9. 接受用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发给后端web服务器,极大减轻了web服务器的压力;
  10. 一边接收web服务器的返回数据,一边发送给浏览器客户端;
  11. 网络依赖性比较低,只要ping同就可以负载均衡;
  12. 可以有多台nginx服务器;
  13. 事件驱动:通信机制采用epoll模型;

10、Redis 支持的数据类型?

  1. String字符串:

11、什么是 Redis 持久化?Redis 有哪几种持久化方式?优缺点是什么?

12、使用过 Redis 分布式锁么,它是怎么实现的?如果在 setnx 之后执行 expire 之前进程意外 crash 或者要重启维护了,那会怎么样?

13、什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?

14、什么是 Redis?简述它的优缺点?

redis(Remote Dictionary Server) 是一个使用C语言编写的,开源的(BSD许可)高性能****非关系型(NOSQL)的键值对数据库
redis可以存储键和5种不同类型的值之间的映射。键的类型只能为字符串,值支持5种数据类型:字符串–列表–散列表–集合–有序集合
与传统数据库不同的是redis的数据时存在内存中的,所以读的写速度非常快,因此redis被广泛应用于缓存方向,每秒可以处理超过10万次读写操作,是已知性能最快的key-value DB。另外,redis也经常用来做分布式锁。除此之外,redis支持事务、持久化、LUA脚本吗、LRU驱动事件、多种集群方案

优点:

  1. 读写性能优异,redis能读的速度是110000次/S,写的速度是81000次/秒;
  2. 支持数据持久化,支持AOF和RDB良种持久化方式;
  3. 支持事务,redis的所有操作都是原子性的,同时redis还支持对几个操作合并后的原子性执行;
  4. 数据结构丰富, 除了支持string(字符串)类型的value外还支持hash(散列表)、set(集合)、 zset(有序集合)、list(列表)等数据结构;
  5. 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离

缺点:

  1. 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此redis适合的场景主要局限在较小数据量的高性能操作和运算上
  2. redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或手动切换前端的ip才能恢复;
  3. 主机宕机,宕机前有部分数据未能及时同步到从机,切换ip还会引入数据不一致的问题,降低了系统可用性;
  4. redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

15、Redis 相比 memcached 有哪些优势?

  1. memcached所有的值均是简单的字符串,redis作为替代者,支持更为丰富的数据类型
  2. redis的速度比memcached快很多
  3. redis可以持久化其数据;

16、Redis 官方为什么不提供 Windows 版本?

因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问题。

17、一个字符串类型的值能存储最大容量是多少?

512M

18、为什么 Redis 需要把所有数据放到内存中?

为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特性。
如果不将数据放到内存中,磁盘的I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置里最大使用的内存,则数据已有记录数达到内存限值后将不能继续插入新值;

19、Redis 有哪些适合的场景?

  1. 会话缓存(session cache)用redis缓存会话比其他存储(如memcached)的优势在于:redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都不会高兴。
  2. 全页缓存(FPC):除基本的会话token之外,redis还提供很简便的FPC平台;
  3. 队列:redis在内存存储引擎领域的一大优点是提供list和set操作,这使得redis能作为一个很好的消息队列平台使用。redis作为队列使用的操作,就类似于本地程序语言对list的push/pop操作;
  4. 排行榜/计数器:redis在内存中对数据进行递增递减的操作实现的非常好。**集合(set)和有序集合(sorted Set)**也使得我们在执行这些操作的时候变得非常简单,redis只是正好提供了这两种数据结构
  5. 订阅/发布

20、Redis 如何做内存优化?

可以好好利用Hash,list,sorted,set等集合类型数据,因为通常情况下很多小的key-value可以用更紧凑的方式存放到一起。尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以应尽可能的将数据模型抽象到散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称 姓氏 邮箱 密码设置单独的key,而是应该 把这个用户的所有信息存储到一张散列表里面

你可能感兴趣的:(Java工程师面试锦囊,redis,java,分布式,nginx)