一、過期(redis主動刪除)
- 設置了ttl過期時間的key,在ttl時間到的時候redis會刪除過期的key。但是redis是惰性過期。
- 惰性過期:redis并不會立即刪除過期的key,而是會在獲取key的時候判斷key是否過期,如果發現key過期了,才會進行刪除。
- 定期刪除:redis為了提升性能和減少內存的使用率,會開啟1個定時任務,serverCorn默認100ms執行1次,從expires dict中以桶的維度去掃描設置了過期時間的key,掃描20個為至(默認,可配置,最多掃描400個桶),如果某個桶掃到1半已經掃到了20個key,則會把當前這個桶掃完。然后從掃描到的key中刪除掉過期的key,如果刪除比例超過10%(默認值,可配置),則會接著執行掃描和刪除邏輯,循環16次之后會有個時間監測,如果超過指定時間則跳出。
二、淘汰(不得已而為之)
- 當redis內存不足的時候,set key沒有足夠的內存,redis以1定的策略刪除掉1些key(有效的數據),來釋放內存,從而保證新數據能set成功,這就是淘汰。
- 淘汰策略:
- novication: 默認淘汰策略,不刪除key,能讀,不能寫;
- allkeys-random:從所有的key中,隨機刪除key;
- volatile-random:隨機從設置了過期時間的key中,刪除數據;
- allkeys-lfu:從所有key中刪除使用頻率(次數)最少的key;
- volatile-lfu: 從設置了過期時間的key中,刪除使用次數最少的key
- allkeys-lru: 從所有key中刪除最近最少使用的key
- volatile-lru: 從設置了過期時間的key中,刪除最近最少使用的key
- volatile-ttl: 從設置了過期時間的key中,刪除快要過期的key
- 如何淘汰:
- 不同的淘汰策略,lru、lfu、ttl會根據采樣計算淘汰值,越大越容易淘汰。并且有1個大小為16的淘汰池,會動態的替換淘汰池中的key,淘汰值越大的key在淘汰池中的位置越靠前。這樣經過采用,保證能淘汰掉最適合被淘汰的數據。