maxmemory 配置指令
maxmemory 用於指定 redis 能使用的最大記憶體。既可以在 redis.conf 檔案中設定, 也可以在執行過程中通過 config set 命令動態修改。
例如, 要設定 100mb 的記憶體限制, 可以在 redis.conf 檔案中這樣配置:
maxmemory 100mb
將 maxmemory 設定為 0, 則表示不進行記憶體限制。當然, 對32位系統來說有乙個隱性的限制條件: 最多 3gb 記憶體。
當記憶體使用達到最大限制時, 如果需要儲存新資料, 根據配置的策略(policies)的不同, redis可能直接返回錯誤資訊, 或者刪除部分老的資料。
lru是redis唯一支援的**演算法
淘汰策略:
1. noeviction:不刪除策略, 達到最大記憶體限制時, 如果需要更多記憶體, 直接返回錯誤資訊。 大多數寫命令都會導致占用更多的記憶體(有極少數會例外, 如 del )。
2. allkeys-lru:所有key通用; 優先刪除最近最少使用(less recently used ,lru) 的 key。
3. volatile-lru:只限於設定了 expire 的部分; 優先刪除最近最少使用(less recently used ,lru) 的 key。
4. allkeys-random:所有key通用; 隨機刪除一部分 key。
5. volatile-random:只限於設定了 expire 的部分; 隨機刪除一部分 key。
6. volatile-ttl:只限於設定了 expire 的部分; 優先刪除剩餘時間(time to live,ttl) 短的key
如果沒有設定 expire 的key, 不滿足先決條件(prerequisites); 那麼 volatile-lru, volatile-random 和 volatile-ttl 策略的行為, 和 noeviction(不刪除) 基本上一致。
您需要根據系統的特徵, 來選擇合適的驅逐策略。 當然, 在執行過程中也可以通過命令動態設定驅逐策略, 並通過 info 命令監控快取的 miss 和 hit, 來進行調優。
一般來說:
volatile-lru 和 volatile-random 策略主要應用場景是: 既有快取,又有持久key的例項中。 一般來說, 像這類場景, 應該使用兩個單獨的 redis 例項。
值得一提的是, 設定 expire 會消耗額外的記憶體, 所以使用 allkeys-lru 策略, 可以更高效地利用記憶體, 因為這樣就可以不再設定過期時間了。
驅逐過程可以這樣理解:
在這個過程中, 記憶體使用量會不斷地達到 limit 值, 然後超過, 然後刪除部分 key, 使用量又下降到 limit 值之下。
如果某個命令導致大量記憶體占用(比如通過新key儲存乙個很大的set), 在一段時間內, 可能記憶體的使用量會明顯超過 maxmemory 限制。
redis 使用的並不是完全lru演算法。自動驅逐的 key , 並不一定是最滿足lru特徵的那個. 而是通過近似lru演算法, 抽取少量的 key 樣本, 然後刪除其中訪問時間最古老的那個key。
驅逐演算法, 從 redis 3.0 開始得到了巨大的優化, 使用 pool(池子) 來作為候選. 這大大提公升了演算法效率, 也更接近於真實的lru演算法。
在 redis 的 lru 演算法中, 可以通過設定樣本(sample)的數量來調優演算法精度。 通過以下指令配置:
maxmemory-samples 5
為什麼不使用完全lru實現? 原因是為了節省記憶體。但 redis 的行為和lru基本上是等價的. Redis淘汰策略
將 redis 用作快取時,如果記憶體空間用滿,就會自動驅逐老的資料。maxmemory用於指定 redis 能使用的最大記憶體。既可以在redis.conf檔案中設定,也可以在執行過程中通過 config set 命令動態修改 當記憶體使用達到最大限制時,如果需要儲存新資料,根據配置的策略 pol...
redis 淘汰策略
lru least recently used 演算法,如果資料最近被訪問過,那麼將來被剛問的機率也是很高的。lfu lfu 如果資料過去被訪問多次,那麼將來被剛問的機率也是更高。過期策略 1惰性刪除,當key被訪問時檢查改key的過期時間,若已過期刪除,已過期未被訪問的資料保持在記憶體中,小號記憶...
redis 淘汰策略
redis 淘汰策略有哪些?1,volatile lru 從已設定過期時間的雜湊表 server.db i expires 中隨機挑選多個key,然後在選到的key中用lru演算法淘汰最近最少使用的資料 2,allkey lru 從所有key的雜湊表 server.db i dict 中隨機挑選多個...