面试问题总结


结合项目

1. spring-shiro  权限问题

使用Shiro Filter 将Shiro和spring整合

<bean id="filterProxy" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 配置的众多filter,只要匹配上了前面的一个,后面的都不会进入了 -->
<bean id="shiroMetaSource" class="com.zhaojiaxiu.framework.shiro.ShiroMetaSource">

2.使用redis的好处 原理  代码

Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库、缓存服务或消息服务使用。

Redis支持多种数据结构,包括字符串 string、哈希表 hash、链表list、集合set、有序集合sorted set、位图、Hyperloglogs等。

Redis具备LRU淘汰、事务实现、以及不同级别的硬盘持久化等能力,并且支持副本集和通过Redis Sentinel实现的高可用方案,同时还支持通过Redis Cluster实现的数据自动分片能力。

Redis的主要功能都基于单线程模型实现,也就是说Redis使用一个线程来服务所有的客户端请求,同时Redis采用了非阻塞式IO,并精细地优化各种命令的算法时间复杂度

前文提到过,Redis采用单线程模型,天然是线程安全的,这使得INCR/DECR命令可以非常便利的实现高并发场景下的精确控制。

代码:spring-data-redis

 /**
     * Increments the number stored at field in the hash stored at key by increment.
     *
     * @param key       key
     * @param field     field
     * @param increment 增量
     * @return 操作后的值
     */
    public Long hIncrBy(final String key, final String field, final Long increment) {
        return (Long) redisTemplate.<Long>execute((RedisCallback<Long>) connection ->
            connection.hIncrBy(key.getBytes(), field.getBytes(), increment)
        );
    }

 

3.使用ActiveMQ的好处,原理 代码  5.13.0

       ActiveMQ持久化节点

3. KahaDB方式

KahaDB是从ActiveMQ 5.4开始默认的持久化插件,也是我们项目现在使用的持久化方式。

KahaDb恢复时间远远小于其前身AMQ并且使用更少的数据文件,所以可以完全代替AMQ。
kahaDB的持久化机制同样是基于日志文件,索引和缓存。

配置方式:

1
2
3
4
5
< persistenceAdapter >
     < kahaDB  directory="${activemq.data}/activemq-data" journalMaxFileLength="16mb"/>
</ persistenceAdapter >
directory : 指定持久化消息的存储目录
journalMaxFileLength : 指定保存消息的日志文件大小,具体根据你的实际应用配置  

(1)KahaDB主要特性
1、日志形式存储消息;
2、消息索引以B-Tree结构存储,可以快速更新;
3、完全支持JMS事务;
4、支持多种恢复机制;

(2)KahaDB的结构

消息存储在基于文件的数据日志中。如果消息发送成功,变标记为可删除的。系统会周期性的清除或者归档日志文件。
消息文件的位置索引存储在内存中,这样能快速定位到。定期将内存中的消息索引保存到metadata store中,避免大量消息未发送时,消息索引占用过多内存空间。

Data logs:
Data logs用于存储消息日志,消息的全部内容都在Data logs中。
同AMQ一样,一个Data logs文件大小超过规定的最大值,会新建一个文件。同样是文件尾部追加,写入性能很快。
每个消息在Data logs中有计数引用,所以当一个文件里所有的消息都不需要了,系统会自动删除文件或放入归档文件夹。

Metadata cache :
缓存用于存放在线消费者的消息。如果消费者已经快速的消费完成,那么这些消息就不需要再写入磁盘了。
Btree索引会根据MessageID创建索引,用于快速的查找消息。这个索引同样维护持久化订阅者与Destination的关系,以及每个消费者消费消息的指针。

Metadata store 
在db.data文件中保存消息日志中消息的元数据,也是以B-Tree结构存储的,定时从Metadata cache更新数据。Metadata store中也会备份一些在消息日志中存在的信息,这样可以让Broker实例快速启动。
即便metadata store文件被破坏或者误删除了。broker可以读取Data logs恢复过来,只是速度会相对较慢些。

4.LevelDB方式

从ActiveMQ 5.6版本之后,又推出了LevelDB的持久化引擎。
目前默认的持久化方式仍然是KahaDB,不过LevelDB持久化性能高于KahaDB,可能是以后的趋势。
在ActiveMQ 5.9版本提供了基于LevelDB和Zookeeper的数据复制方式,用于Master-slave方式的首选数据复制方案。

       ActiveMQ服务器挂掉问题解决---尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大

       ActiveMQ丢消息问题解决--用持久化消息,或者非持久化消息及时处理不要堆积,或者启动事务,启动事务后,commit()方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。

       ActiveMQ.DLQ死信管理

4.Elasticsreach的好处,原理 分词器 代码

    

5.spring mvc spring spring boot

6.Mybaits 的优点

7.GC

8.四个系统之间的调用关系

9.jsp 和servlet

10.dubbo优点相对其他网络编程 原理

11.关键字 来控制并发操作 volied 和

12.new 对象 在jvm中存储

11.struts2的过滤器filter 和spring MVC 的拦截器Interceptor 

  ①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。

  ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

  ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

两者的本质区别:拦截器是基于java的反射机制的,而过滤器是基于函数回调。
从灵活性上说拦截器功能更强大些,Filter能做的事情,他都能做,而且可以在请求前,请求后执行,比较灵活。
Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。
不过还是根据不同情况选择合适的。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM