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
网友评论