redis的內存管理主要依靠兩個進程:內存回收進程和AOF持久化進程。下面將重點講解 Redis 內存回收機制,以及這個機制如何工作。
一、Redis的內存回收機制
Redis 使用了內存池(memory pool)來分配空間,并且它針對不同對象的大小,提供了不同的內存分配策略。
Redis中所有的鍵值都保存在內存中,如果內存占滿,Redis服務器就會stop working, 同時遇到讀寫請求將返回錯誤信息OOM(Out of Memory)。為了預防這種情況,Redis 為內存回收提供了三個命令:
1、基于過期時間取消 key
2、基于 LRU (Least Recently Used)算法淘汰長時間未使用的鍵/值對
3、數據庫壓縮
二、Redis的內存回收進程
1、什么是Redis的內存回收進程?
Redis 的內存回收處理單獨形成一個線程或者進程,在 Redis 中被稱為“內存回收進程”(memory reclaiming thread/process)。Redis 首先在時間上進行判斷,對那些已過期但是尚未被刪除的 keys 進行標記,這樣它們就可以在之后被立即釋放并回收所占用的內存。
2、原理與操作流程
Redis 內存回收進程的基本原理是周期性地掃描存儲數據庫中所有的鍵,并一步步對所有鍵進行檢測:
(1)、判斷鍵是否已經過期
(2)、是否使用了LRU算法,以及它最后一次被訪問的時間
(3)、是否被刪除但仍然留在內存中(當多個客戶端同時訪問同一個 key VALUE 時,如果沒有正確處理引用計數,則會發生這種情況)
首先檢查是否有需要根據過期時間自動刪除的鍵(expired key)。每次檢查只對一小部分鍵進行處理。如果有符合條件的 key,內存回收線程就把它們標記為過期,在之后立即回收并釋放為其分配的內存。
然后,Redis 檢查那些沒有被過期,但仍然占用大量內存的鍵。如果所選鍵比快滿了,Redis 就選擇其中最早要刪除的幾個鍵,并釋放它們所占用的空間。
除了定期回收外,Redis 還支持手動釋放 key VALUE 占用內存的方法:通過向 Redis 發送一個 flushall 命令和可使用“shutdown”斷開連接的方式來清除所有數據。
三、總結
Redis 的內存管理主要依靠兩個進程:內存回收進程和AOF持久化進程(如果打開). 在Redis中,所有鍵值都保存在內存中,如果內存滿了,Redis將停止工作,同時遇到讀寫請求將返回錯誤信息OOM(OutOfMemory)。為了預防這種情況,Redis為內存回收提供了三個命令。
Redis的內存回收進程對Redis的性能以及數據安全都有很大的影響。謹慎編寫和使用上述三個操作并對內存進行適度分配可以幫助我們充分利用Redis的高效性能,并確保數據不會被意外損壞或刪除。在實際使用過程中,開發人員應該結合業務特點選擇合適的手段進行規劃和調整,以優化內部的性能。