Redis的Set數(shù)據(jù)結(jié)構(gòu)提供了以下四種數(shù)據(jù)淘汰策略:
- noeviction(默認(rèn)策略):當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,新寫入操作會報錯。只有在沒有設(shè)置淘汰策略或者設(shè)置的淘汰策略無效時,才會使用這個策略。需要注意的是,這種策略并不會淘汰任何已經(jīng)存在的數(shù)據(jù)。
- allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,新寫入操作會報錯。將會淘汰最近最少使用的數(shù)據(jù)。也就是說,如果某個key被訪問過,那么它就不會被淘汰,即使內(nèi)存空間不足。這個策略適用于訪問模式有明顯冷熱差異的場景。
- volatile-lru:與allkeys-lru相似,但只淘汰設(shè)置了過期時間的key。如果某個key沒有設(shè)置過期時間,那么即使內(nèi)存空間不足,也不會被淘汰。這個策略適用于key的訪問模式有明顯冷熱差異,且大部分key都有過期時間的場景。
- volatile-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,新寫入操作會報錯。將會從已設(shè)置過期時間的數(shù)據(jù)集(server. db[i]. expires)中任意選擇數(shù)據(jù)淘汰。這個策略適用于訪問模式無明顯冷熱差異,且對key的訪問是隨機(jī)的場景。
- volatile-ttl:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,新寫入操作會報錯。將會淘汰剩余過期時間最短的數(shù)據(jù)。這個策略適用于訪問模式無明顯冷熱差異,且大部分key都有過期時間的場景,可以優(yōu)先淘汰即將過期的數(shù)據(jù)以節(jié)省空間。
在使用這些淘汰策略時,需要根據(jù)具體的應(yīng)用場景和需求來選擇合適的策略。同時,需要注意的是,淘汰策略只會在Redis內(nèi)存使用達(dá)到maxmemory設(shè)置的值時才會觸發(fā)。因此,合理設(shè)置maxmemory也是使用淘汰策略的重要一環(huán)。