Java面试之项目技术之NOSQL

静态化介绍

 

我们在做项目的时候经常会遇到单个显示的页面,访问量较大,较高,很少修改,更新量少,我们可以将该页面用freemaker模板生成静态化页面,这时候访问的时候只需要访问静态化页面,不需要和数据库进行交互(不需要访问数据库),大大减轻了数据库的压力,像我们招聘网的公司详情,岗位详情(app的商品详情,新闻详情)都用的是freemaker生成的静态化页面,当时涉及到一个同步的问题,就是数据库已经进行了更新,静态化页面却没有更新,我们的处理方式是当新增或者是修改一条数据到数据库的时候,在业务逻辑层调用freemaker封装方法,重新生成当前静态化页面,将当前记录表明+id作为生成的静态化页面名称,一次来防止生成的静态化页面相互覆盖,我们freemaker的封装方法只需要传三个参数就可以了,第一个是模板的名称,第二个是传递当前数据对象,第三个是指定生成的静态化页面的位置。

 

 

Redis介绍

 

Redis当时项目里边有一些经常访问,更新较少的数据,像我们当时项目中涉及到(招聘网的广告位,电子商务的首页推荐产品,热销产品,新闻类网站,新闻列表和点播排行榜,内网系统的用户id和权限的关系,内网系统的资产清单)redis是一个服务及缓存,首先需要安装一个redis服务(windows里的是redis.bat服务,linux的是redis.sh文件 双击进行启动)redis存储的数据支持对象,集合,map,json,字符串,一般我们存的都是可序列化对象(可序列化对象是指可转化为二进制的对象,反序列化是指将二进制返回为对象,session,application,request为非序列化对象,不能再redis里面进行存储),redis1000万条数据以内性能还是很高的,超过1000万条的话性能就会明显降低,(redis和mongodb相比的话,同样1000万条数据redis性能比较高,超过1000万条的话mongodb性能比较高,来源于网络测试数据)redis读取速度为每秒80000,写入速度为每秒110000,并且支持持久化,可以设置存储(测试的数据为每个对象10kb)支持冷热交互(持久化可以通过命令行来设置)冷热交互是指经常使用的数据会在redis开辟的内存服务里面,这些数据叫热数据,一旦这些热数据被调用的次数减少,会持久化到硬盘,硬盘上的数据一旦被经常调用,又会转移到redis内存上边,redis支持集群,同时支持哨兵监控,当时做招聘网站的时候,redis就配置了集群,公司有配置文档,当时是经理带着我们进行配置的(redis集群情况下,多个redis存储的内容通常都是一样的,连接的时候只需要连接主redis,如果主redisDown机,哨兵会自动切换到让别的redis继续返回其他的数据)

Redis和spring整合获取redis Template的模板工具类,查询用get,存储用set,set方法有两种,第一种有两个参数,key和value,第二种有三个参数,除了key和value还有另外一种参数,在用的时候需要做一个if判断,拿着方法名和参数作为key值,如果有的话直接去redis去取,取到了就进行展示,没有的话就直接存到redis,下次使用的话就可以直接进行展示。。

 

 

Mongodb介绍

Mongodb是非关系型数据库,mongodb的存储数据量可以超过上亿条(老版本的mongodb有数据丢失的情况,新版本不会出现),mongodb适用于存储一些量大但是表关系较简单一些的数据,例如用户信息,用户注册信息,公司注册信息,留言信息,留言评论,操作日志等信息,mongodb还可以用作分布式文件存储系统,我们在做招聘网站的时候,项目里边主要用mongodb来存储操作日志(银行的转账付款记录,角色权限变动日志),我们主要是结合AOP来使用的,首先配置一个AOP的切面类,接着给出切面类,接着给出AOP 的使用规则(配置的时候就是*.*.*.*),哪个类中的哪个方法,使用当前的切面类,利用后置通知获取当前方法的操作日志,将操作日志存储到mongodb,然后进行分类管理查看。

 

  1. 首先给出切面类,生命一个方法
  2. 接着给出切面规则。

 

 

Apache+tomcat集群

我们当时测试服务器配置了一个Apache+tomcat集群作为duboo的消费者,生产者一端我们部署了两个独立的tomcat,生产者和消费者之间通过zookeeper来调度,apachetomcat集群的时候 首先Apache需要安装一个muddle.so的控件 这个空间主要功能就是apache和tomcat的关联,指定动态请求交给tomcat来处理 tomcat需要实现两步 第一步实现tomcat轮询处理 第二步 tomcat实现session共享 最后一步web.xml需要加入一个标签.

dubbo+zookeerper的介绍:
dubbo是2012年的阿里巴巴的开源分布式框架,可以实现项目模块之间的拆分部署,dubbo分为生产者和消费者,生产者和消费者之间采用长连接来进行关联(httpclient数据属于短请求,一次请求,一次响应,dubbo通道一旦建立(一旦连接),一直处于联通状态)dubbo基于tcp/ip协议的,交互性能非常高,支持匿名传参,影视传参,泛化调用(影视传:不是以括号形势的形势传参,将参数存储到当前请求里面,到了服务端再从请求里面拿出来,request不能传参。泛化调用:是指采用一个service接口和一个service实现类来实现多个方法的调用)我们当时这个项目把页面+控制层作为消费者,service+dao作为生产者,生产者和消费者之间采用zookeerper进行调度。


dubbo+zookeerper怎样实现session共享(在消费端):
我们的消费者只有一个模块,所有的请求首先都是进入这个模块里面,生产者有多个模块,session都在消费者这个action里面,所有的请求都是首先进入这个项目里面,我们的生产者有多个模块。如果有多个消费者的情况下,会存在session共享问题,我们可以将session的id作为key值,用户对象作为value值存储到redis里面。当每次发送的请求的时候,拿着浏览器的session的id去redis里面取,如果能取到,证明用户已经存在,如果不能取到,就重新登录。


zookeerper的作用:
zookeerper用来完成生产者的接口在zookeerper里面的注册,当一个生产者挂掉的同时,zookeerper会把当前请求分发给别的生产者。当新的生产者启动的时候,zookeerper也会给新的生产者分发任务。zookeerper也可以实现集群。


spring的理解:
spring是一个容器,设计之初的思想,前端它是整合struts,后台整合hibernet,mybatis,ibatis等。它贯穿于表现层,业务层及持久层。
spring分为ioc和aop
ioc控制反转,将java功能交给spring管理,ioc分为属性注入,构造函数注入,工厂注入。

------------------>属性注入
------------------------->构造函数注入
--------------------------->工厂注入


spring的bean对象与bean对象之间查找方式有两种,byName(按属性查找)和byType(按类型查找)
aop面向切面编程,分为前置通知和后置通知。前置通知可以完成参数效验。
请求的有效性效验是指利用aop前置通知排除httpclient无效的请求。
aop的后置通知可以获取操作日志。
spring利用aop实现事务的开启和提交(spring本身没有事务,操作的是数据库的事务)
aop分为动态代理和静态代理。
静态的代理类容易产生过多的代理类,造成类爆炸(内存过多)
动态代理是用反射机制来创建代理类。分为jdk动态代理和cglib代理。jdk动态代理基于接口的代理被实现,cglib代理基于类的代理被实现。
我们通常配置的 *.*.* 是基于动态代理。通常给注解的action,service,dao层,将当前bean注入spring里面,表示它是一个bean,,扫描的时候将它进行注入。
resource注解--------默认按名称查找,autowire注解:按类查找
@Controller  —声明控制层
@RequestMapping(value="system")——配置请求地址
jsp——传递的数据—使用方法的参数接收
return "redirect: 具体的请求地址";—redirect跳转

@RequestMapping(value="test/{声明变量名}")——在请求地址中传递参数
@PathVariable(value=url中声明的变量名) 数据类型 使用时的变量名
如:
//http://localhost:8080/bbt-cms/system/test/guolin.bbt
@RequestMapping(value="test/{str}")
//@PathVariable:获取url中的参数——   @PathVariable(value=url中声明的变量名) 数据类型 使用时的变量名

public String test(@PathVariable(value="str") String str2 ,HttpServletRequest request){
loger.info(str2);
request.setAttribute("msg", str2);
return "../index";
}



控制层返回数据————jsp
在方法中声明HttpServletRequest request
request.setAttribute(变量名, 数据值);


7.数据库集群介绍:
当时我们这个数据库访问压力过大,做了个主从同步,用了两个mysql数据库,所有的更新走主库,所有的查询走从库。主库,从库之间通过日志进行同步,首先主库设置一个用户,给出所有权限,获取主库的服务id和日志属性值,将主库的server id 和日志属性id添加到从库的my.cnf文件里面,当主库产生sql日志或操作日志,从库跟主库保持一致。
问题:
1.主从同库延迟问题?
1.主库和同库尽可能在同一个局域网内,交换机网卡采用千兆网卡。
2.主数据库更新完成之后产生的操作日志不是瞬间产生的,我们可以通过设置sync_binlog=1, 让它瞬间产生磁盘日志,(n=1指主数据库只要操作一次,就产生一次磁盘日志,n=10,就是操作10次,产生一次),从数据库可以依赖磁盘日志,瞬间产生同步,可以达到减低延迟的效果。
3. 设置主库和从库读取日志失败之后,及时重新建立连接,延迟缩短。

 

你可能感兴趣的:(java面试开箱即用)