Redis學習筆記2-使用 Redis 作為 LRU 緩存

来源:http://www.cnblogs.com/houziwty/archive/2016/01/14/5129946.html
-Advertisement-
Play Games

當 Redis 作為緩存使用時,當你添加新的數據時,有時候很方便使 Redis 自動回收老的數據。LRU 實際上是被唯一支持的數據移除方法。Redis 的 maxmemory 指令,用於限制記憶體使用到一個固定的容量,也包含深入探討 Redis 使用的 LRU 演算法,一個近似準確的 LRU。maxme...


當 Redis 作為緩存使用時,當你添加新的數據時,有時候很方便使 Redis 自動回收老的數據。LRU 實際上是被唯一支持的數據移除方法。Redis 的 maxmemory 指令,用於限制記憶體使用到一個固定的容量,也包含深入探討 Redis 使用的 LRU 演算法,一個近似準確的 LRU。

maxmemory 配置指令(configuration directive)

maxmemory 配置指令是用來配置 Redis 為數據集使用指定的記憶體容量大小。可以使用 redis.conf 文件來設置配置指令,或者之後在運行時使用 CONFIG SET 命令。

例如,為了配置記憶體限製為 100MB,可以在 redis.conf 文件中使用以下指令

maxmemory 100mb

設置 maxmemory 為 0,表示沒有記憶體限制。這是 64 位系統的預設行為,32 位的系統則使用 3G 大小作為隱式的記憶體限制。

當指定的記憶體容量到達時,需要選擇不同的行為,即策略。Redis 可以只為命令返回錯誤,這樣將占用更多的記憶體,或者每次添加新數據時,回收掉一些舊的數據以避免記憶體限制。

回收策略(Eviction policies)

當 maxmemory 限制到達的時候,Redis 將採取的準確行為是由 maxmemory-policy 配置指令配置的。

以下策略可用:

  • noeviction:當到達記憶體限制時返回錯誤。當客戶端嘗試執行命令時會導致更多記憶體占用(大多數寫命令,除了 DEL 和一些例外)。
  • allkeys-lru:回收最近最少使用(LRU)的鍵,為新數據騰出空間。
  • volatile-lru:回收最近最少使用(LRU)的鍵,但是只回收有設置過期的鍵,為新數據騰出空間。
  • allkeys-random:回收隨機的鍵,為新數據騰出空間。
  • volatile-random:回收隨機的鍵,但是只回收有設置過期的鍵,為新數據騰出空間。
  • volatile-ttl:回收有設置過期的鍵,嘗試先回收離 TTL 最短時間的鍵,為新數據騰出空間。

當沒有滿足前提條件的話,volatile-lru,volatile-random 和 volatile-ttl 策略就表現得和 noeviction 一樣了。

選擇正確的回收策略是很重要的,取決於你的應用程式的訪問模式,但是,你可以在程式運行時重新配置策略,使用 INFO 輸出來監控緩存命中和錯過的次數,以調優你的設置。

一般經驗規則:

  • M 如果你期待你的用戶請求呈現冪律分佈(power-law distribution),也就是,你期待一部分子集元素被訪問得遠比其他元素多,可以使用 allkeys-lru 策略。在你不確定時這是一個好的選擇。
  • 如果你是迴圈周期的訪問,所有的鍵被連續掃描,或者你期待請求正常分佈(每個元素以相同的概率被訪問),可以使用 allkeys-random 策略。
  • 如果你想能給 Redis 提供建議,通過使用你創建緩存對象的時候設置的 TTL 值,確定哪些對象應該被過期,你可以使用 volatile-ttl 策略。

當你想使用單個實例來實現緩存和持久化一些鍵,allkeys-lru 和 volatile-random 策略會很有用。但是,通常最好是運行兩個 Redis 實例來解決這個問題。

另外值得註意的是,為鍵設置過期時間需要消耗記憶體,所以使用像 allkeys-lru 這樣的策略會更高效,因為在記憶體壓力下沒有必要為鍵的回收設置過期時間。

回收過程 (Eviction process)

理解回收的過程是這麼運作的非常的重要:

  • 一個客戶端運行一個新命令,添加了新數據。
  • Redis 檢查記憶體使用情況,如果大於 maxmemory 限制,根據策略來回收鍵。
  • 一個新的命令被執行,如此等等。

通過檢查,然後回收鍵以返回到限制以下,來連續不斷的穿越記憶體限制的邊界。

如果一個命令導致大量的記憶體被占用 (像一個很大的集合交集保存到一個新的鍵),一會功夫記憶體限制就會被這個明顯的記憶體量所超越。

近似的 LRU 演算法(Approximated LRU algorithm)

Redis 的 LRU 演算法不是一個精確的實現。這意味著 Redis 不能選擇最佳候選鍵來回收,也就是最久錢被訪問的那些鍵。相反,會嘗試運營一個近似的 LRU 演算法,通過採樣一小部分鍵,然後在採樣鍵中回收最適合(擁有最久訪問時間)的那個。

Redis 的 LRU 演算法有一點很重要,你可以調整演算法的精度,通過改變每次回收時檢查的採樣數量。這個參數可以通過如下配置指令

maxmemory-samples 5 

Redis 沒有使用真實的 LRU 實現的原因,是因為這會消耗更多的記憶體。然而,近似值對使用 Redis 的應用來說基本上也是等價的。為 Redis 使用的 LRU 近似值和真實 LRU 之間的比較。

Redis 服務被填充了指定數量的鍵。鍵被從頭訪問到尾,所以第一個鍵是 LRU 演算法的最佳候選回收鍵。然後,再新添加 50% 的鍵,強制一般的舊鍵被回收。

在理論的 LRU 實現中,我們期待看到的是,在舊鍵中第一半會過期。而 Redis 的 LRU 演算法則只是概率性的過期這些舊鍵。

你可以看到,同樣採用 5 個採樣,Redis 3.0 表現得比 Redis 2.8 要好,Redis 2.8 中最近被訪問的對象之間的對象仍然被保留。在 Redis 3.0 中使用 10 為採樣大小,近似值已經非常接近理論性能。

註意,LRU 只是一個預言指定鍵在未來如何被訪問的模式。另外,如果你的數據訪問模式非常接近冪律,大多數的訪問都將集中在一個集合中,LRU 近似演算法將能處理得很好。

在模擬實驗的過程中,我們發現使用冪律訪問模式,真實的 LRU 演算法和 Redis 的近似演算法之間的差異非常小,或者根本就沒有。

然而,你可以提高採樣大小到 10,這會消耗額外的 CPU,來更加近似於真實的 LRU 演算法,看看這會不會使你的緩存錯失率有差異。

使用 CONFIG SET maxmemory-samples 命令在生產環境上試驗各種不同的採樣大小值是很簡單的。

  

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一,效果圖。二,工程圖。三,代碼。RootViewController.h#import @interface RootViewController : [email protected]#import "RootViewController.h"#im...
  • Xcode中的常用快捷鍵
  • 懶載入又叫延遲載入,他有兩個好處,第一:當使用時才載入,而不是一開始就載入,為CPU節省時間做其他的事情,第二:記載之前會判斷數據是否為空,如果空是空的才去載入,避免了重覆載入數據,系統可能會清理記憶體使數組為空,這樣確保數組不為空 有時plist文件不是一層可能兩層甚至多層,記住先建小模型,究竟如....
  • 管理MySQL資料庫最簡單和最便利的方式是PHP腳本。運行PHP腳本使用HTTP協議和android系統連接。我們以JSON格式編碼數據,因為Android和PHP都有現成的處理JSON函數。下麵示例代碼,根據給定的條件從資料庫讀取數據,轉換為JSON數據。通過HTTP協議傳給android,and...
  • 在iOS開發過程中經常需要與伺服器進行數據通訊,Json就是一種常用的高效簡潔的數據格式。問題現象但是幾個項目下來一直遇到一個坑爹的問題,程式在獲取某些數據之後莫名崩潰。其實很早就發現了原因:由於伺服器的資料庫中有些欄位為空,然後以Json形式返回給客戶端時就會出現這樣的數據:?1"somevalu...
  • 1、建立一個drawable文件list_divider.xml 2、設置listView的divider的樣式//必須帶上,否則不顯示
  • 本文是特效界面設計,在美圖秀秀的特效模塊主要是實現圖片添加濾鏡效果,界面挺炫的。界麵包含黑邊和虛化按鈕,4種類型的濾鏡,每種類型又包含許多具體濾鏡效果,當我們點擊時候開始處理圖片1.載入圖片self.imageView = [[UIImageView alloc] initWithImage:s.....
  • 其中加了一些動畫2016-01-13其中主要的方法有:Demo下載地址,Demo中有介紹:https://github.com/lizhaojie001/UIview.git
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...