當前位置:編程學習大全網 - 源碼下載 - Redis數據的過期和刪除

Redis數據的過期和刪除

惰性處理

Redis在遇到get操作時會刪除過期的密鑰。

集中式處理

Redis會把帶過期時間的密鑰放在壹個獨立的字典裏,默認是每秒10次過期掃描。掃描模式:

為防止掃描時間過長,掃描時間限制在25ms,開發時應避免大量密鑰同時過期。

從庫不會被掃描過時。當主庫被刪除時,del指令將被添加到AOF文件以與所有從庫同步,並且從庫將通過該指令被刪除。因為指令的同步是異步的,所以主從數據會有不壹致。

當Redis內存超過物理內存限制時,內存數據會開始頻繁地與磁盤交換,使得性能急劇下降。為了限制內存的使用,Redis提供了參數maxmemory來限制最大內存。當內存超出時,會有以下策略(maxmemory-policy)來消除鍵以騰出空間:

由於LRU算法需要消耗大量的額外內存,redis采用了近似LRU算法。它為每個鍵添加了壹個額外的小字段(24位),這是最後壹次訪問的時間戳。每次執行寫操作時,如果發現內存超過maxmemory,則隨機抽取5個鍵(由參數maxmemory_samples配置),然後淘汰最老的鍵。如果淘汰後仍超過,則繼續隨機淘汰,直到不超過為止。如果maxmemory-policy是volatile-xxx,則從設置了到期時間的密鑰中采樣,否則從所有密鑰中采樣。

Redis3.0增加了淘汰池,是壹個數組,大小為maxmemory_samples。在每次消除時,隨機選擇的鍵將與數組中的鍵合並,最老的鍵將被消除,然後剩余的更老的鍵將被放入消除池,用於下壹個循環。

刪除redis del可能會在刪除大對象時導致堵塞。為了解決這個問題,Redis4.0引入了unlink指令,將這個鍵的對象引用從Redis的內存數據中刪除,並將刪除操作封裝成壹個任務,扔進異步隊列中。然後壹個異步線程將從這個隊列中取出任務並執行它。

清空操作flushdb和flushall,在Redis4.0之後,在指令後面加上async,也可以像上面壹樣異步執行。

Redis深度冒險:核心原則和應用實踐

  • 上一篇:關於java圖像處理
  • 下一篇:2020年個人工作總結3篇
  • copyright 2024編程學習大全網