2018-10-23
三種過期策略:
定時刪除:
含義:在設(shè)置key的過期時間的同時,為該key創(chuàng)建一個定時器,讓定時器在key的過期時間來臨時,對key進行刪除
優(yōu)點:保證內(nèi)存被盡快釋放
缺點:
若過期key很多,刪除這些key會占用很多的CPU時間,在CPU時間緊張的情況下,CPU不能把所有的時間用來做要緊的事兒,還需要去花時間刪除這些key
定時器的創(chuàng)建耗時,若為每一個設(shè)置過期時間的key創(chuàng)建一個定時器(將會有大量的定時器產(chǎn)生),性能影響嚴(yán)重
沒人用
惰性刪除:
含義:key過期的時候不刪除,每次從數(shù)據(jù)庫獲取key的時候去檢查是否過期,若過期,則刪除,返回null。
優(yōu)點:
刪除操作只發(fā)生在從數(shù)據(jù)庫取出key的時候發(fā)生,而且只刪除當(dāng)前key,所以對CPU時間的占用是比較少的,而且此時的刪除是已經(jīng)到了非做不可的地步(如果此時還不刪除的話,我們就會獲取到了已經(jīng)過期的key了)
缺點:
若大量的key在超出超時時間后,很久一段時間內(nèi),都沒有被獲取過,那么可能發(fā)生內(nèi)存泄露(無用的垃圾占用了大量的內(nèi)存)
定期刪除:
含義:每隔一段時間執(zhí)行一次刪除過期key操作
優(yōu)點:
通過限制刪除操作的時長和頻率,來減少刪除操作對CPU時間的占用--處理"定時刪除"的缺點
定期刪除過期key--處理"惰性刪除"的缺點
缺點:
在內(nèi)存友好方面,不如"定時刪除"
在CPU時間友好方面,不如"惰性刪除"
難點:
合理設(shè)置刪除操作的執(zhí)行時長(每次刪除執(zhí)行多長時間)和執(zhí)行頻率(每隔多長時間做一次刪除)(這個要根據(jù)服務(wù)器運行情況來定了)
注意:
memcached只是用了惰性刪除,而redis同時使用了惰性刪除與定期刪除,這也是二者的一個不同點(可以看做是redis優(yōu)于memcached的一點)
對于惰性刪除而言,并不是只有獲取key的時候才會檢查key是否過期,在某些設(shè)置key的方法上也會檢查(eg.setnx key2 value2:該方法類似于memcached的add方法,如果設(shè)置的key2已經(jīng)存在,那么該方法返回false,什么都不做;如果設(shè)置的key2不存在,那么該方法設(shè)置緩存key2-value2。假設(shè)調(diào)用此方法的時候,發(fā)現(xiàn)redis中已經(jīng)存在了key2,但是該key2已經(jīng)過期了,如果此時不執(zhí)行刪除操作的話,setnx方法將會直接返回false,也就是說此時并沒有重新設(shè)置key2-value2成功,所以對于一定要在setnx執(zhí)行之前,對key2進行過期檢查)