1. LRU アルゴリズムを使用するように Redis を設定します。
LRU (最も最近使用されていない) アルゴリズムは、数多くあるアルゴリズムの 1 つです。置換アルゴリズムの一種。
Redis には maxmemory の概念があり、主に使用されるメモリを固定サイズに制限します。 Redis で使用される LRU アルゴリズムは近似 LRU アルゴリズムです。
(1) maxmemory の設定
上記の通り、maxmemory は Redis の最大メモリ使用量を制限するためのものです。サイズを設定するにはいくつかの方法があります。 1 つの方法は、次のように 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"
もう 1 つの方法は、構成ファイル redis.conf を変更することです:
maxmemory 100mb
64 ビット システムでは、maxmemory が次のように設定されることに注意してください。 0 Redis のメモリ使用量が制限されていないことを示します。32 ビット システムでは、maxmemory は暗黙的に 3GB を超えることができません。
Redis のメモリ使用量が指定された制限に達した場合は、交換戦略を選択する必要があります。
(2) 置換ポリシー
Redis のメモリ使用量が maxmemory に達した場合、設定された maxmemory-policy を選択して古いデータを置き換える必要があります。
選択できる置換方法は次のとおりです:
noeviction: 置換なし、つまりメモリが上限に達しても置換は実行されません。メモリ増加を引き起こす可能性のあるコマンドはエラーを返します
allkeys-lru: 新しいデータを保存するために、最近使用頻度が最も低いキーを優先的に削除します
volatile-lru: 新しいデータを保存するために削除する期限切れのキーの中で最も使用頻度の低いキーを選択するのみを設定します
allkeys-random: すべてのキーからいくつかのキーをランダムに選択します。新しいデータを保存するには
- #volatile-random: 期限切れのセット キーから一部のキーのみを選択して削除し、新しいデータを保存します
- volatile-ttl : 有効期限が切れた設定キーの中から生存時間 (TTL) が最も短いキーのみを選択して削除し、新しいデータを保存します
- すべてのキーが最近最も頻繁に使用されている場合は、allkeys-lru を選択して最新のキーを置き換える必要があります。最も頻繁に使用されないキー。どの戦略を使用すればよいかわからない場合は、allkeys-lru を使用することをお勧めします。
- すべてのキーのアクセス確率が類似している場合は、allkeys-random 戦略を使用してデータを置き換えることができます。
- データを十分に理解しており、キーのヒント (expire/ttl で指定) を指定できる場合は、置換用に volatile-ttl を選択できます。
次のような置換戦略がどのように実行されるかを理解することが非常に重要です。
#クライアントが新しいコマンドを実行すると、データベースはデータを追加する必要があります (キー値の設定など)- Redis はメモリ使用量をチェックします。メモリ使用量が超過した場合は、 maxmemory、置換戦略に従って削除されます。いくつかのキー
- 新しいコマンドは正常に実行されました
- データの継続的な書き込みは、メモリが上限 maxmemory に達するかそれを超える原因になりますが、交換戦略によりメモリ使用量は上限を下回ります。 一度に大量のメモリを使用する必要がある場合 (大規模なセットを一度に書き込むなど)、Redis のメモリ使用量が一定期間最大メモリ制限を超える可能性があります。
(4) 近似 LRU アルゴリズム
Redis の LRU は、厳密な LRU アルゴリズム実装ではなく、主にメモリ占有量の節約とパフォーマンスの向上を目的とした近似 LRU 実装です。 Redis には maxmemory-samples という構成があります。Redis の LRU は、構成された数のキーを取り出し、その中で最も使用頻度の低いキーを選択して置き換えます。デフォルトは次のように 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 中国語 Web サイトの他の関連記事を参照してください。

redisactsassassadatastoreandaservice.1)asadatastore、itusesin memorystorage for fastorations、supporting variousdatastructureSlike-key-valuepairsandsortedsets.2)asaservice、iteasruascruascriptingrupting criptingforceptingpurplecomplecomplecprexoperations

他のデータベースと比較して、Redisには次の独自の利点があります。1)非常に速い速度、および読み取り操作は通常、マイクロ秒レベルにあります。 2)豊富なデータ構造と操作をサポートします。 3)キャッシュ、カウンター、公開サブスクリプションなどの柔軟な使用シナリオ。 Redisまたはその他のデータベースを選択する場合、特定のニーズとシナリオに依存します。 Redisは、高性能および低遅延のアプリケーションでうまく機能します。

Redisは、データストレージと管理において重要な役割を果たしており、複数のデータ構造と持続性メカニズムを通じて最新のアプリケーションの中核となっています。 1)Redisは、文字列、リスト、コレクション、注文されたコレクション、ハッシュテーブルなどのデータ構造をサポートし、キャッシュや複雑なビジネスロジックに適しています。 2)RDBとAOFの2つの持続方法を通じて、Redisは信頼できるストレージとデータの迅速な回復を保証します。

Redisは、大規模なデータの効率的なストレージとアクセスに適したNOSQLデータベースです。 1.Redisは、複数のデータ構造をサポートするオープンソースメモリデータ構造ストレージシステムです。 2.キャッシュ、セッション管理などに適した、非常に速い読み取り速度と書き込み速度を提供します。 4.使用例には、基本的なキー値ペア操作と高度なコレクション重複排除関数が含まれます。 5.一般的なエラーには、接続の問題、データ型の不一致、メモリオーバーフローが含まれるため、デバッグに注意する必要があります。 6.パフォーマンス最適化の提案には、適切なデータ構造の選択とメモリ排除戦略の設定が含まれます。

現実世界でのRedisのアプリケーションには、1。キャッシュシステムとして、データベースクエリを加速し、2。Webアプリケーションのセッションデータを保存するには、3。リアルタイムランキングを実装する4。メッセージ配信をメッセージキューとして簡素化する。 Redisの汎用性と高性能により、これらのシナリオで輝きます。

Redisは、高速、汎用性、豊富なデータ構造のために際立っています。 1)Redisは、文字列、リスト、コレクション、ハッシュなどのデータ構造をサポートし、コレクションを注文します。 2)メモリを介してデータを保存し、RDBとAOFの持続性をサポートします。 3)Redis 6.0から始めて、マルチスレッドI/O操作が導入されました。これにより、高い並行性シナリオでパフォーマンスが向上しました。

redisisclassifiedsaNosqldatabasebasesakey-valuedataModelinsteaded ofthetraditionaldatabasemodel.itoffersspeedand andffficability、makingidealforreal-timeaplications andcaching、butmaynotbesbesutable fors cenariois requiring datientiantientioniity

Redisは、データをキャッシュし、分散ロックとデータの持続性を実装することにより、アプリケーションのパフォーマンスとスケーラビリティを向上させます。 1)キャッシュデータ:Redisを使用して頻繁にアクセスしたデータをキャッシュして、データアクセス速度を向上させます。 2)分散ロック:Redisを使用して分散ロックを実装して、分散環境での操作のセキュリティを確保します。 3)データの持続性:データの損失を防ぐために、RDBおよびAOFメカニズムを介してデータセキュリティを確保します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

WebStorm Mac版
便利なJavaScript開発ツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。
