ホームページ データベース Redis Redis で LRU アルゴリズムを設定する方法

Redis で LRU アルゴリズムを設定する方法

May 23, 2020 am 08:58 AM
redis

Redis で LRU アルゴリズムを設定する方法

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) が最も短いキーのみを選択して削除し、新しいデータを保存します

なお、次の点に注意してください:

( 1) maxmemory-policy の設定方法は、maxmemory の設定方法と似ており、redis.conf または CONFIG SET を通じて動的に変更できます。

(2) 削除できる一致するキーがない場合、volatile-lru、volatile-random、および volatile-ttl 戦略は noeviction 置換戦略と同じであり、キーは置き換えられません。

(3) 適切な置換戦略を選択することは非常に重要であり、主にアプリケーションのアクセス モードに依存します。もちろん、Redis コマンドを使用して置換戦略を動的に変更し、出力することもできます。 - INFO キャッシュ ヒット率を使用して、置換戦略を調整できます。

一般的に、いくつかの一般的な経験があります:

  • すべてのキーが最近最も頻繁に使用されている場合は、allkeys-lru を選択して最新のキーを置き換える必要があります。最も頻繁に使用されないキー。どの戦略を使用すればよいかわからない場合は、allkeys-lru を使用することをお勧めします。

  • すべてのキーのアクセス確率が類似している場合は、allkeys-random 戦略を使用してデータを置き換えることができます。

  • データを十分に理解しており、キーのヒント (expire/ttl で指定) を指定できる場合は、置換用に volatile-ttl を選択できます。

volatile-lru と volatile-random は、1 つの Redis インスタンスがキャッシュと永続化の両方に使用される場合によく使用されますが、問題を解決するには 2 つの Redis インスタンスを使用することをお勧めします。問題。

有効期限を設定するとメモリを占有しますが、allkeys-lru を使用すると有効期限を設定する必要がないため、メモリをより効率的に使用できます。

#(3) 置換戦略の仕組み

次のような置換戦略がどのように実行されるかを理解することが非常に重要です。

#クライアントが新しいコマンドを実行すると、データベースはデータを追加する必要があります (キー値の設定など)

  1. Redis はメモリ使用量をチェックします。メモリ使用量が超過した場合は、 maxmemory、置換戦略に従って削除されます。いくつかのキー

  2. 新しいコマンドは正常に実行されました

  3. データの継続的な書き込みは、メモリが上限 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 で LRU アルゴリズムを設定する方法

测试开始首先在Redis中导入一定数目的key,然后从第一个key依次访问到最后一个key,因此根据LRU算法第一个被访问的key应该最新被置换,之后再增加50%数目的key,导致50%的老的key被替换出去。

在上图中你可以看到三种类型的点,组成三种不同的区域:

  1. 淡灰色的是被置换出去的key

  2. 灰色的是没有被置换出去的key

  3. 绿色的是新增加的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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Redisクラスターモードの構築方法 Redisクラスターモードの構築方法 Apr 10, 2025 pm 10:15 PM

Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisデータをクリアする方法 Redisデータをクリアする方法 Apr 10, 2025 pm 10:06 PM

Redisデータをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。

Redisコマンドの使用方法 Redisコマンドの使用方法 Apr 10, 2025 pm 08:45 PM

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

単一のスレッドレディスの使用方法 単一のスレッドレディスの使用方法 Apr 10, 2025 pm 07:12 PM

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

Redisのソースコードを読み取る方法 Redisのソースコードを読み取る方法 Apr 10, 2025 pm 08:27 PM

Redisソースコードを理解する最良の方法は、段階的に進むことです。Redisの基本に精通してください。開始点として特定のモジュールまたは機能を選択します。モジュールまたは機能のエントリポイントから始めて、行ごとにコードを表示します。関数コールチェーンを介してコードを表示します。 Redisが使用する基礎となるデータ構造に精通してください。 Redisが使用するアルゴリズムを特定します。

基礎となるRedisを実装する方法 基礎となるRedisを実装する方法 Apr 10, 2025 pm 07:21 PM

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redisキューの読み方 Redisキューの読み方 Apr 10, 2025 pm 10:12 PM

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

Redisロックの使用方法 Redisロックの使用方法 Apr 10, 2025 pm 08:39 PM

Redisを使用して操作をロックするには、setnxコマンドを介してロックを取得し、有効期限を設定するために有効期限コマンドを使用する必要があります。特定の手順は次のとおりです。(1)SETNXコマンドを使用して、キー価値ペアを設定しようとします。 (2)expireコマンドを使用して、ロックの有効期限を設定します。 (3)Delコマンドを使用して、ロックが不要になったときにロックを削除します。

See all articles