一、redis的過期策略和記憶體淘汰機制
1、定期刪除+惰性刪除
定期刪除:指的是redis預設是每隔100ms就隨機抽取一些設定了過期時間的key,檢查其是否過期,如果過期就刪除
惰性刪除:在你獲取某個key的時候,redis會檢查一下 ,這個key如果設定了過期時間那麼是否過期了,如果過期了此時就會刪除,不會給你返回任何東西
2、如果大量過期key堆積在記憶體裡,導致redis記憶體塊耗盡了,怎麼辦?
記憶體淘汰機制:
redis.conf中配置:
1# maxmemory-policy noeviction
noeviction:當記憶體使用達到閾值的時候,所有引起申請記憶體的命令會報錯。
allkeys-lru:在主鍵空間中,優先移除最近未使用的key。
volatile-lru:在設定了過期時間的鍵空間中,優先移除最近未使用的key。
allkeys-random:在主鍵空間中,隨機移除某個key。
volatile-random:在設定了過期時間的鍵空間中,隨機移除某個key。
volatile-ttl:在設定了過期時間的鍵空間中,具有更早過期時間的key優先移除。
二、手寫lru快取12
3456
78910
1112
1314
1516
1718
1920
2122
2324
2526
2728
public
class
lrucache
};
}
public
int
get(
int
key)
public
void
put(
int
key,
int
value)
}
linkedhashmap的原始碼說明 :
對於 linkedhashmap 而言,它繼承與 hashmap(public class linkedhashmapextends hashmapimplements map
)、
底層使用雜湊表與雙向鍊錶來儲存所有元素。
linkedhashmap 中的 entry 整合與 hashmap 的 entry,但是其增加了 before 和 after 的引用,指的是上乙個元素和下乙個元素的引用12
3456
static
class
entry
extends
hashmap.node
}
初始化:
在 linkedhashmap 的構造方法中,實際呼叫了父類 hashmap 的相關構造方法來構造乙個底層存放的 table 陣列,但額外可以增加 accessorder 這個引數,如果不設定,預設為 false,代表按照插入順序進行迭代;當然可以顯式設定為 true,代表以訪問順序進行迭代12
3456
public
linkedhashmap(
int
initialcapacity,
float
loadfactor,
boolean
accessorder)
Redis的過期策略和記憶體淘汰策略
redis的過期策略 我們都知道,redis是key value資料庫,我們可以設定redis中快取的key的過期時間。redis的過期策略就是指當redis中快取的key過期了,redis如何處理。過期策略通常有以下三種 定時過期 每個設定過期時間的key都需要建立乙個定時器,到過期時間就會立即清...
Redis的過期策略和記憶體淘汰策略
在redis中我們對於鍵可以通過expire key time設定生存時間,當time時間過後鍵就會過期,redis會採用過期策略對過期的鍵進行刪除。過期策略主要是在cpu和記憶體之間進行權衡。可以將cpu的處理效率作為側重點進行選擇策略,也可以將記憶體的容量作為側重點進行選擇策略實際上redis採...
Redis的過期策略和記憶體淘汰策略
我們都知道,redis是key value資料庫,我們可以設定redis中快取的key的過期時間。redis的過期策略就是指當redis中快取的key過期了,redis如何處理。過期策略通常有以下三種 redis中同時使用了惰性過期和定期過期兩種過期策略。redis的記憶體淘汰策略是指在redis的...