美文网首页
6月19日面试总结

6月19日面试总结

作者: 拼搏男孩 | 来源:发表于2020-06-19 20:11 被阅读0次

1、Servlet的生命周期

1.加载和实例化:Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。

2.初始化:容器将调用Servlet的init()方法初始化这个对象。

3.请求处理:Servlet容器调用Servlet的service()方法对请求进行处理。

4.服务终止:当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。

2、Hibernate中SessionFactory和Session是否是线程安全对象

SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。 Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。

3、警察小偷爸爸妈妈儿子女儿过河

大概是岸上有警察,小偷,爸爸,妈妈,两个儿子,两个女儿,一共八个人,只有警察,爸爸,妈妈会划船,警察不在时,小偷会杀其他人,爸爸不在时,妈妈会打儿子,妈妈不在时,爸爸会打女儿,除了划船的人,船上只能载一人,问要划多少次才能把所有人运到岛上

1、犯人以及警察首先过河,警察回来;
2、警察与女儿过河,警察与犯人回来;
3、妈妈与女儿过河,妈妈回来;
4、妈妈与爸爸过河,爸爸回来;
5、警察与犯人过河,妈妈回来;
6、妈妈与爸爸过河,爸爸回来;
7、爸爸与儿子过河,警察与犯人回来;
8、警察与儿子过河;警察回来;
9、警察与犯人过河。

4、redis与memcached的区别:

  • redis支持五种数据类型(string、hash、list、set、zset),memcached仅支持字符串类型
  • redis支持数据的备份,memcached不支持
  • redis支持数据的持久化
  • redis是单线程,memcached是多线程

5、降低token 被盗风险安全问题

  • 将token放在请求头中
  • 使用https协议
  • 将token的过期时间设置的短一点
  • 绑定ip地址

6、redis中setnx的用法

Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。

redis Setnx 命令基本语法如下:

redis 127.0.0.1:6379> SETNX KEY_NAME VALUE

返回值:

设置成功,返回 1 。 设置失败,返回 0 。

redis分布式锁的实现:

分布式锁要满足两个条件:一个是加有效时间的锁,一个是高性能解锁。

采用redis命令setnx、与setex来实现

private StringRedisTemplate redisTemplate;
private static final String publicKey="CommonKey";
public void setNx() {
        try {
            String value = "20200619";
            lock= redisTemplate.opsForValue().setIfAbsent(publicKey, value);
            //判断是否获取锁
            if(!lock){
                //如果没有获取锁
                String result=redisTemplate.opsForValue().get(publicKey);
            }else{
                //说明已经获取锁并且成功设置了值
                //然后设置过期时间
                redisTemplate.opsForValue().set(publicKey,value,60, TimeUnit.SECONDS);
                Thread.sleep(5000);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //最后一定要释放锁
            redisTemplate.delete(publicKey);
        }

但是,这种代码是有缺陷的,在setnx和setex中间发生了服务down机,这种情况有两种解决办法:第一种是使用redis的lua脚本,保证原子性,第二种方式:Redis从2.6之后支持setnx、setex连用:SET lock_key random_value NX PX 5000

local lockKey = KEYS[1]
local lockTime = KEYS[2]
local lockValue = KEYS[3]

-- setnx info
local result_1 = redis.call('SETNX', lockKey, lockValue)
if result_1 == 1
then
local result_2= redis.call('SETEX', lockKey,lockTime, lockValue)
return result_2
else
return 'faild'
end

相关文章

网友评论

      本文标题:6月19日面试总结

      本文链接:https://www.haomeiwen.com/subject/wymbxktx.html