分布式高并发Nginx面试要点

一、分布式缓存
硬盘上的数据,缓存在别的计算机(不是程序运行的计算机)的内存上
而且可以缓存的计算机的个数不止一个,可以使n个
用户通过访问http服务器,然后访问应用服务器资源,应用服务器调用后端的数据库,
在第一次访问的时候,直接访问数据库,然后将要缓存的内容放入到memcached集群,集群
规模根据缓存文件的大小而定。在第二次访问的时候就直接进入缓存读取,不需要进行
数据库的操作。这个适合数据变化不频繁的场景,比如:互联网站显示的榜单、阅读排行等、

redis和memcached的区别
如果简单地比较redis和memcached的区别,大多数都会得到以下观点:
1、redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
2、redis支持数据的备份,即master-slave模式的数据备份
3、redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
在redis中,并不是所有的数据都一直存储在内存中的。这是和memcached相比一个最大的却别(我个人是这么认为的)

redis
用户发出查询类似的请求,Nix判断是pc端还是M端,假如是pc端,先从redis缓存里面查询所需要的数据
如果有则直接返回,如果没有则通过API数据接口(做一个查询的接口)直接从数据库(DB mysql等)里面查
把最新查新查询的结果先放到redis缓存里,再将查询的结果返回给PC客户端
nigix有个功能叫静态代理 先把储存静态文件的nfs给配置到nigix中  nfs文件系统主要用来存储静态得东西,css 图片 js

redis是一种高级的key:value存储系统,其中value支持五中数据类型
1、字符串(string)
2、字符串列表(list)
3、字符串集合(sets)
5、哈希(hashes)
而关于key,有几点要提醒大家:
1、key不要太长,计量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率
2、key也不要太短,太短的话,key的可读性会降低
3、在一个项目中,key最好使用同一的命名模式,例如user:10000:password.
redis中的lists在底层实现上并不是数组,而是链表。
redis的集合是一种无序的集合,集合中的元素没有先后的顺序
redis中的hashes存的是字符串和字符串之间的映射

redis提供了两种持久化的方式,分别是RDB(redis dataBase)和AOF(Append Only File)
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上
AOF,则是换了一个角度来实现持久化,那就是讲redis执行过的所有写指令记录下来,在下次redis重新启动时,
只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复
这是因为AOF方式的数据恢复完整度更高。

redis的事务处理
1、MULTI用来组装一个事务
2、EXEC用来执行一个事务
3、DISCARD用来取消一个事物
4、WATCH用来监视一些key,一点这些key在事务执行之前被改变,则取消事务的执行
面试题:
1、mysql里有2000W的数据,redis中值存20W的数据,如何保证redis中的数据都是热点数据?
设置maxmemory为20W数据的容量,然后用allkeys-lru
2、使用redis有哪些好处?
1、速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
2、支持丰富数据类型,支持string,list,set,sorted set,hash
3、支持事务,操作都是原子性,所谓原子性就是对数据的更改要么全部执行,要么全部不执行
4、丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
3、redis相比memcached有哪些优势?
1、memcached所有的值均是简单的字符串,redis作为其其替代者,支持更为丰富的数据类型
2、redis的速度比memcached快很多
3、redis可以持久化其数据
4、redis常见性能问题和解决方案:
1、Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
2、如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
3、为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
4、尽量避免在压力河大的主库上增加从库
5、主从复制不要用图状结构,用单向链表结构更为稳定,这样的结构方便解决单点故障问题,
实现slave对master的替换。如果master挂了,可以立刻启动slave做master,其他不变
5、redis怎么和spring进行集成
1.引入jar包
2、配置bean 在application.xml加入如下配置 jedis配置 reids服务器中心 cache配置
不需要加入缓存的类 不需要缓存的方法 设置缓存失效时间
shiro
6、redis内存数据集大小上升到一定大小的时候,就会执行数据淘汰策略。redis提供6中数据淘汰策略:
1、volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最新最少使用的数据淘汰
2、volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
3、volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
4、allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
5、allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
6、no-enviction(驱逐):禁止驱逐数据
7、redis常见的性能问题都有哪些?如何解决?
1、.Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,
会间断性暂停服务,所以Master最好不要写内存快照
2、.Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF
文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是
不要日用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次
3、.Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,
出现短暂服务暂停现象。
4、.Reids主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内
8、请用Redis和任意语言实现一段恶意登录保护的代码,限制一小时内每用户ID最多只能登录5次。
具体登录函数或功能用空函数即可,不用详细写出。
用列表实现:列表中每个元素代表登录时间,只要最后的第5次登录时间和现在时间差不多超过1小时就禁止登录。
用Python写的代码如下:

二、高并发
什么是高并发?
多个进程或线程同时(或者说在同一段时间内)访问同一资源会产生并发问题。
初期解决方案
1、系统或服务器级别的解决方案
增大服务器的CPU
增大内存条
增加硬盘个数,对硬盘做Raid5
换掉免费哦的Tomcat,使用商用weblogic(美国Oracle公司出品的)
增加到二块网卡
聘请系统架构师优化Linux内核
甚至花高价直接购买高性能服务器
2、应用级别的解决方案
网页HTML静态化(需要CMS项目支持)
图片服务期分离(常用解决方案)
缓存(常用解决方案)上上策为分布式缓存
镜像(下载较多)
3、采用负载均衡技术
为了满足业务量增长的需求,衍生出来的一种脸颊有效透明的方法以扩展现有网络设备
和服务器的带宽,增加吞吐量、加强网络数据处理能力,提高网络的灵活性和可用性的技术
就是负载均衡(Load Balance)
三负载均衡
负载均衡有三大作用:1、转发请求 2、故障移除 3、恢复添加
负载均衡种类
1、一种是通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的
负载均衡器,但是它们是比较昂贵。
2、一种是通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux
系统并且开元的负载均衡策略

负载均衡-然间解决
主流软件:1.apache+JK 2、nginx 3、lvs+keepalived

什么是nginx?
Nginx是一款轻量级的web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在
一个BSD-like协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎
Rambler(漫步者)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型
的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、腾讯等。
优点:
1、可运行linux,并有windows移植版
2、在高连接并发的情况下,Nginx是Apache服务器不错的替代品,Nginx在美国是做虚拟主机生意的老板们
经常选择的软件平台之一。能够支持高达50000个并发连接数的响应

调度器的实现技术中,IP负载均衡技术是效率最高的,IP虚拟服务器软件(IPVS)实在linux内核中实现的

Nginx
nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。
Http代理,反向代理:作为web服务器最常用的功能之一。 Nginx在做反向代理时,提供性能稳定,并且能够
提供配置灵活的转发功能。 Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走
文件服务器,动态页面走web服务器。并且nginx对返回结果进行错误页面跳转,异常判断等。如果被分发的服务器存在
异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
nigix提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询。Ip hash。扩展策略,
就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。
Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器
进行护理,可以解决session不共享的问题。
web缓存 nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对
FastCGI的动态程序进行缓存,配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以进行增删管理。
Nginx配置 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进行pid存放路径,
日志存放路径,配置文件引入,允许生成worker process数等。 2、events块:配置影响nginx服务器或与用户的网络连接。
有每个进程的最大连接数,选取哪种时间驱动模型处理连接请求,是否允许同时接受多个忘了连接,开启多个网络连接序列化等
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,
日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。4、server块:配置虚拟主机的相关参数,一个http中
可以有多个server。5、location块:配置请求的路由,以及各种页面的处理情况。
还要注意以下几点:1、$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;2.$remote_user:用来记录客户端用户名称
3、$time_local:用来记录访问时间与时区 4、$request:用来记录请求的url与http协议 5.$status:用来记录请求状态,成功200
6.$body_bytes_s ent:记录发送给客户端文件主题内容大小;7.$http_user_agent:记录客户端浏览器的相关信息
惊群现象:一个网络连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得连接,这样会影响系统系能。
每个指令必须有分号结束。
ngin是工作在网络7层的
四、集群间session共享问题
session共享实现方案
session共享有多重解决办法,常用的有四种:客户端Cookie保存,服务器间session同步、使用集群管理Session、
把session持久化到数据库
集群中session共享解决方案
1、客户端存储方案
2、集中式session共享方案
3、session复制方案
4、把session持久化到数据库

session保存到redis简单实现
1、配置web.xml过滤器sessionFilter
2、在spring配置文件中配置对应的过滤器名字:
3、sessionFilter的实现
4、TerryHttpServletRequestWrapper的实现(关于session增删改查的四个方法)
5、CacheHttpSession的实现
6、HttpSessionWrapper的实现


五、面试介绍
您好,很高兴能来本公司面试,我叫牛建军,毕业于郑州轻工业学院,之后在郑州的一家公司做了2年的
java开发。在工作期间大概参与了三个项目的开发。
第一个项目是二手车竞拍管理系统,由于刚到公司所以负责的内容难度不大。第二个项目是一个电器设备公司的资源管理
系统,在这个项目中,我主要负责了系统管理模块、系统技术资料图纸管理模块以及登录模块的开发。系统管理模块又分为用户管理
角色管理、运行监控、数据字典四个子模块,在技术资料图纸管理模块用了lucene搜索,并且有高亮效果。
还负责了权限系统的开发,使用hibernate缓存和sql优化来提高网站性能。
整个负责的模块使用了大量的js和jquery组件,比如fck,jxl,jfreechart,Z-tree等等
第三个项目是一个服装的电商项目。在这个项目中主要负责后台商品管理页面,前台商品列表页面,以及商品详情页和购物车模块。
在前台商品列表页面用页面缓OSCache存来提高性能,商品详情页是后台商品上架时Freemarker自动生成的
网站存在大量的图片读写操作,使用了jersey技术搭建图片服务器集群,这些都缓解了服务器的压力,另外还是用了分布式缓存redis来
提高网站性能,把session存储到redis达到集群下session共享
为了解决网站高并发的问题,在数据库端使用mysql的读写分离和主从复制,在服务器端使用了负载均衡。
我非常热爱java,通过这几年了学习掌握了基本的java开发,但在我面前未知的依然是一片大海,我会努力也希望能够在这个行业更长远的发展。

六、工具
visio是微软的 可以画业务流程图、网络图、工作流图、数据库模型图和软件图
Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具
powerDesigner是设计数据库模型的,包括面向对象模型、业务流程模型、概念数据模型、物理数据模型等
  • 4
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值