redis中設定lru演算法的方法
1、設定Redis使用LRU演算法
LRU(Least Recently Used)最近最少使用演算法是眾多置換演算法中的一種。
Redis中有一個maxmemory概念,主要是為了將使用的記憶體限定在固定的大小。 Redis用到的LRU 演算法,是一種近似的LRU演算法。
(1)設定maxmemory
上面已經說過maxmemory是為了限定Redis最大記憶體使用量。有多種方法設定它的大小。其中一個方法是透過CONFIG SET設定,如下:
127.0.0.1:6379> CONFIG GET maxmemory 1) "maxmemory" 2) "0" 127.0.0.1:6379> CONFIG SET maxmemory 100MB OK 127.0.0.1:6379> CONFIG GET maxmemory 1) "maxmemory" 2) "104857600"
另一種方法是修改設定檔redis.conf:
maxmemory 100mb
注意,在64bit系統下,maxmemory設定為0表示不限制Redis記憶體使用,在32bit系統下,maxmemory隱式不能超過3GB。
當Redis記憶體使用達到指定的限制時,就需要選擇一個置換的策略。
(2)置換策略
當Redis記憶體使用達到maxmemory時,需要選擇設定好的maxmemory-policy進行舊資料的置換。
以下是可以選擇的置換策略:
noeviction: 不進行置換,表示即使記憶體達到上限也不進行置換,所有能造成記憶體增加的指令都會回傳error
allkeys-lru: 優先刪除掉最近最不常使用的key,用以保存新資料
volatile-lru: 只從設置在失效(expire set)的key中選擇最近最不常使用的key進行刪除,用以保存新資料
allkeys-random: 隨機從all-keys中選擇一些key進行刪除,用以儲存新資料
volatile-random: 只從設定失效(expire set)的key中,選擇一些key進行刪除,用以儲存新資料
volatile-ttl: 只從設定失效(expire set)的key中,選出存活時間(TTL)最短的key進行刪除,用以儲存新資料
要注意的是:
(1)設定maxmemory-policy的方法和設定maxmemory方法類似,透過redis.conf或是透過CONFIG SET動態修改。
(2)如果沒有匹配到可以刪除的key,那麼volatile-lru、volatile-random和volatile-ttl策略和noeviction替換策略一樣——不對任何key進行置換。
(3)選擇合適的置換策略是很重要的,這主要取決於你的應用程式的存取模式,當然你也可以動態的修改置換策略,並透過用Redis指令-INFO去輸出cache的命中率情況,進而可以對置換策略進行調優。
一般來說,有這樣一些常用的經驗:
在所有的key都是最近最經常使用,那麼就需要選擇allkeys-lru進行置換最近最不常使用的key,如果你不確定要使用哪種策略,那麼建議使用allkeys-lru。
如果所有的key的存取機率都是差不多的,那麼可以選用allkeys-random策略去置換資料。
如果對資料有足夠的了解,能夠為key指定hint(透過expire/ttl指定),那麼可以選擇volatile-ttl進行置換。
volatile-lru 和 volatile-random經常在一個Redis實例既做cache又做持久化的情況下用到,然而,更好的選擇使用兩個Redis實例來解決這個問題。
設定是失效時間expire會佔用一些內存,而採用allkeys-lru就沒有必要設定失效時間,進而更有效的利用內存。
(3)置換策略是如何運作的
理解置換策略的執行方式是非常重要的,例如:
客戶端執行一條新指令,導致資料庫需要增加資料(例如set key value)
#Redis會檢查記憶體使用,如果記憶體使用超過maxmemory,就會依照置換策略刪除一些key
新的指令執行成功
#我們持續的寫資料會導致記憶體達到或超出上限maxmemory,但是置換策略會將記憶體使用降低到上限以下。
如果一次需要使用很多的記憶體(例如一次寫入一個很大的set),那麼,Redis的記憶體使用可能超出最大記憶體限制一段時間。
(4)近似LRU演算法
Redis中的LRU不是嚴格意義上的LRU演算法實現,是近似的LRU實現,主要是為了節約內存佔用以及提升效能。 Redis有這樣一個配置-maxmemory-samples,Redis的LRU是取出配置的數目的key,然後從中選擇一個最近最不經常使用的key進行置換,預設的5,如下:
maxmemory-samples 5
可以透過調整樣本數量來取得LRU置換演算法的速度或精確性方面的優勢。
Redis不採用真正的LRU實作的原因是為了節約記憶體使用。雖然不是真正的LRU實現,但是它們在應用上幾乎是等價的。下圖是Redis的近似LRU實現和理論LRU實現的對比:
测试开始首先在Redis中导入一定数目的key,然后从第一个key依次访问到最后一个key,因此根据LRU算法第一个被访问的key应该最新被置换,之后再增加50%数目的key,导致50%的老的key被替换出去。
在上图中你可以看到三种类型的点,组成三种不同的区域:
淡灰色的是被置换出去的key
灰色的是没有被置换出去的key
绿色的是新增加的key
理论LRU实现就像我们期待的那样,最旧的50%数目的key被置换出去,Redis的LRU将一定比例的旧key置换出去。
可以看到在样本数为5的情况下,Redis3.0要比Redis2.8做的好很多,Redis2.8中有很多应该被置换出去的数据没有置换出去。在样本数为10的情况下,Redis3.0很接近真正的LRU实现。
LRU是一个预测未来我们会访问哪些数据的模型,如果我们访问数据的形式接近我们预想——幂律,那么近似LRU算法实现将能处理的很好。
在模拟测试中我们可以发现,在幂律访问模式下,理论LRU和Redis近似LRU的差距很小或者就不存在差距。
如果你将maxmemory-samples设置为10,那么Redis将会增加额外的CPU开销以保证接近真正的LRU性能,可以通过检查命中率来查看有什么不同。
通过CONFIG SET maxmemory-samples
2、LRU的实现
<?php /** * LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面 */ class LRU_Cache { private $array_lru = array(); private $max_size = 0; function __construct($size) { // 缓存最大存储 $this->max_size = $size; } public function set_value($key, $value) { // 如果存在,则向队尾移动,先删除,后追加 // array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回true,如果键名不存在则返回false。 if (array_key_exists($key, $this->array_lru)) { // unset() 销毁指定的变量。 unset($this->array_lru[$key]); } // 长度检查,超长则删除首元素 if (count($this->array_lru) > $this->max_size) { // array_shift() 函数删除数组中第一个元素,并返回被删除元素的值。 array_shift($this->array_lru); } // 队尾追加元素 $this->array_lru[$key] = $value; } public function get_value($key) { $ret_value = false; if (array_key_exists($key, $this->array_lru)) { $ret_value = $this->array_lru[$key]; // 移动到队尾 unset($this->array_lru[$key]); $this->array_lru[$key] = $ret_value; } return $ret_value; } public function vardump_cache() { echo "<br>"; var_dump($this->array_lru); } } $cache = new LRU_Cache(5); // 指定了最大空间 6 $cache->set_value("01", "01"); $cache->set_value("02", "02"); $cache->set_value("03", "03"); $cache->set_value("04", "04"); $cache->set_value("05", "05"); $cache->vardump_cache(); echo "<br>"; $cache->set_value("06", "06"); $cache->vardump_cache(); echo "<br>"; $cache->set_value("03", "03"); $cache->vardump_cache(); echo "<br>"; $cache->set_value("07", "07"); $cache->vardump_cache(); echo "<br>"; $cache->set_value("01", "01"); $cache->vardump_cache(); echo "<br>"; $cache->get_value("04"); $cache->vardump_cache(); echo "<br>"; $cache->get_value("05"); $cache->vardump_cache(); echo "<br>"; $cache->get_value("10"); $cache->vardump_cache(); echo "<br>";
更多redis知识请关注redis入门教程栏目。
以上是redis中設定lru演算法的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。
