1、Servlet的生命周期
1.加載和實(shí)例化:Servlet容器負(fù)責(zé)加載和實(shí)例化Servlet法绵。當(dāng)Servlet容器啟動(dòng)時(shí)徽曲,或者在容器檢測到需要這個(gè)Servlet來響應(yīng)第一個(gè)請求時(shí)呜舒,創(chuàng)建Servlet實(shí)例。
2.初始化:容器將調(diào)用Servlet的init()方法初始化這個(gè)對象荣月。
3.請求處理:Servlet容器調(diào)用Servlet的service()方法對請求進(jìn)行處理管呵。
4.服務(wù)終止:當(dāng)容器檢測到一個(gè)Servlet實(shí)例應(yīng)該從服務(wù)中被移除的時(shí)候,容器就會(huì)調(diào)用實(shí)例的destroy()方法喉童,以便讓該實(shí)例可以釋放它所使用的資源撇寞,保存數(shù)據(jù)到持久存儲設(shè)備中。當(dāng)需要釋放內(nèi)存或者容器關(guān)閉時(shí)堂氯,容器就會(huì)調(diào)用Servlet實(shí)例的destroy()方法蔑担。在destroy()方法調(diào)用之后,容器會(huì)釋放這個(gè)Servlet實(shí)例咽白,該實(shí)例隨后會(huì)被Java的垃圾收集器所回收啤握。如果再次需要這個(gè)Servlet處理請求,Servlet容器會(huì)創(chuàng)建一個(gè)新的Servlet實(shí)例晶框。
2排抬、Hibernate中SessionFactory和Session是否是線程安全對象
SessionFactory對應(yīng)Hibernate的一個(gè)數(shù)據(jù)存儲的概念懂从,它是線程安全的,可以被多個(gè)線程并發(fā)訪問蹲蒲。SessionFactory一般只會(huì)在啟動(dòng)的時(shí)候構(gòu)建番甩。 Session是一個(gè)輕量級非線程安全的對象(線程間不能共享session),它表示與數(shù)據(jù)庫進(jìn)行交互的一個(gè)工作單元届搁。
3缘薛、警察小偷爸爸媽媽兒子女兒過河
大概是岸上有警察,小偷卡睦,爸爸宴胧,媽媽,兩個(gè)兒子表锻,兩個(gè)女兒恕齐,一共八個(gè)人,只有警察瞬逊,爸爸显歧,媽媽會(huì)劃船,警察不在時(shí)码耐,小偷會(huì)殺其他人追迟,爸爸不在時(shí),媽媽會(huì)打兒子骚腥,媽媽不在時(shí),爸爸會(huì)打女兒瓶逃,除了劃船的人束铭,船上只能載一人,問要?jiǎng)澏嗌俅尾拍馨阉腥诉\(yùn)到島上
1厢绝、犯人以及警察首先過河契沫,警察回來;
2昔汉、警察與女兒過河懈万,警察與犯人回來;
3靶病、媽媽與女兒過河会通,媽媽回來;
4娄周、媽媽與爸爸過河涕侈,爸爸回來;
5煤辨、警察與犯人過河裳涛,媽媽回來木张;
6、媽媽與爸爸過河端三,爸爸回來舷礼;
7、爸爸與兒子過河郊闯,警察與犯人回來妻献;
8、警察與兒子過河虚婿;警察回來旋奢;
9、警察與犯人過河然痊。
4至朗、redis與memcached的區(qū)別:
- redis支持五種數(shù)據(jù)類型(string、hash剧浸、list锹引、set、zset)唆香,memcached僅支持字符串類型
- redis支持?jǐn)?shù)據(jù)的備份嫌变,memcached不支持
- redis支持?jǐn)?shù)據(jù)的持久化
- redis是單線程,memcached是多線程
5躬它、降低token 被盜風(fēng)險(xiǎn)安全問題
- 將token放在請求頭中
- 使用https協(xié)議
- 將token的過期時(shí)間設(shè)置的短一點(diǎn)
- 綁定ip地址
6腾啥、redis中setnx的用法
Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在時(shí),為 key 設(shè)置指定的值冯吓。
redis Setnx 命令基本語法如下:
redis 127.0.0.1:6379> SETNX KEY_NAME VALUE
返回值:
設(shè)置成功倘待,返回 1 。 設(shè)置失敗组贺,返回 0 凸舵。
redis分布式鎖的實(shí)現(xiàn):
分布式鎖要滿足兩個(gè)條件:一個(gè)是加有效時(shí)間的鎖,一個(gè)是高性能解鎖失尖。
采用redis命令setnx啊奄、與setex來實(shí)現(xiàn)
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{
//說明已經(jīng)獲取鎖并且成功設(shè)置了值
//然后設(shè)置過期時(shí)間
redisTemplate.opsForValue().set(publicKey,value,60, TimeUnit.SECONDS);
Thread.sleep(5000);
}
}catch (Exception e){
e.printStackTrace();
}finally {
//最后一定要釋放鎖
redisTemplate.delete(publicKey);
}
但是,這種代碼是有缺陷的掀潮,在setnx和setex中間發(fā)生了服務(wù)down機(jī)菇夸,這種情況有兩種解決辦法:第一種是使用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