2018-10-23
三種過(guò)期策略:
定時(shí)刪除:
含義:在設(shè)置key的過(guò)期時(shí)間的同時(shí),為該key創(chuàng)建一個(gè)定時(shí)器盒齿,讓定時(shí)器在key的過(guò)期時(shí)間來(lái)臨時(shí),對(duì)key進(jìn)行刪除
優(yōu)點(diǎn):保證內(nèi)存被盡快釋放
缺點(diǎn):
若過(guò)期key很多狭魂,刪除這些key會(huì)占用很多的CPU時(shí)間阅茶,在CPU時(shí)間緊張的情況下,CPU不能把所有的時(shí)間用來(lái)做要緊的事兒坏晦,還需要去花時(shí)間刪除這些key
定時(shí)器的創(chuàng)建耗時(shí)萝玷,若為每一個(gè)設(shè)置過(guò)期時(shí)間的key創(chuàng)建一個(gè)定時(shí)器(將會(huì)有大量的定時(shí)器產(chǎn)生),性能影響嚴(yán)重
沒(méi)人用
惰性刪除:
含義:key過(guò)期的時(shí)候不刪除昆婿,每次從數(shù)據(jù)庫(kù)獲取key的時(shí)候去檢查是否過(guò)期球碉,若過(guò)期,則刪除仓蛆,返回null睁冬。
優(yōu)點(diǎn):
刪除操作只發(fā)生在從數(shù)據(jù)庫(kù)取出key的時(shí)候發(fā)生,而且只刪除當(dāng)前key看疙,所以對(duì)CPU時(shí)間的占用是比較少的豆拨,而且此時(shí)的刪除是已經(jīng)到了非做不可的地步(如果此時(shí)還不刪除的話直奋,我們就會(huì)獲取到了已經(jīng)過(guò)期的key了)
缺點(diǎn):
若大量的key在超出超時(shí)時(shí)間后,很久一段時(shí)間內(nèi)施禾,都沒(méi)有被獲取過(guò)脚线,那么可能發(fā)生內(nèi)存泄露(無(wú)用的垃圾占用了大量的內(nèi)存)
定期刪除:
含義:每隔一段時(shí)間執(zhí)行一次刪除過(guò)期key操作
優(yōu)點(diǎn):
通過(guò)限制刪除操作的時(shí)長(zhǎng)和頻率,來(lái)減少刪除操作對(duì)CPU時(shí)間的占用--處理"定時(shí)刪除"的缺點(diǎn)
定期刪除過(guò)期key--處理"惰性刪除"的缺點(diǎn)
缺點(diǎn):
在內(nèi)存友好方面弥搞,不如"定時(shí)刪除"
在CPU時(shí)間友好方面邮绿,不如"惰性刪除"
難點(diǎn):
合理設(shè)置刪除操作的執(zhí)行時(shí)長(zhǎng)(每次刪除執(zhí)行多長(zhǎng)時(shí)間)和執(zhí)行頻率(每隔多長(zhǎng)時(shí)間做一次刪除)(這個(gè)要根據(jù)服務(wù)器運(yùn)行情況來(lái)定了)
注意:
memcached只是用了惰性刪除,而redis同時(shí)使用了惰性刪除與定期刪除攀例,這也是二者的一個(gè)不同點(diǎn)(可以看做是redis優(yōu)于memcached的一點(diǎn))
對(duì)于惰性刪除而言斯碌,并不是只有獲取key的時(shí)候才會(huì)檢查key是否過(guò)期,在某些設(shè)置key的方法上也會(huì)檢查(eg.setnx key2 value2:該方法類似于memcached的add方法肛度,如果設(shè)置的key2已經(jīng)存在傻唾,那么該方法返回false,什么都不做承耿;如果設(shè)置的key2不存在冠骄,那么該方法設(shè)置緩存key2-value2。假設(shè)調(diào)用此方法的時(shí)候加袋,發(fā)現(xiàn)redis中已經(jīng)存在了key2凛辣,但是該key2已經(jīng)過(guò)期了,如果此時(shí)不執(zhí)行刪除操作的話职烧,setnx方法將會(huì)直接返回false扁誓,也就是說(shuō)此時(shí)并沒(méi)有重新設(shè)置key2-value2成功,所以對(duì)于一定要在setnx執(zhí)行之前蚀之,對(duì)key2進(jìn)行過(guò)期檢查)