Redis キャッシュがいっぱいの場合はどうすればよいですか?

Redis キャッシュはメモリを使用してデータを保存するため、キャッシュする必要があるデータ量が増加すると、限られたキャッシュ領域が必然的にいっぱいになります。この時点で、何をすべきでしょうか? この記事の次は、キャッシュがいっぱいになった後のデータ削除メカニズムについて説明します。

有効期限ポリシーとメモリ削除ポリシーは、 Redis における 2 つの完全に異なる概念であることに注意してくださいRedis の有効期限戦略は、Redis が期限切れのキーと値のペアを削除するためにどの戦略を使用するかを示し、メモリ削除メカニズムは、Redis の実行メモリが最大メモリ セット値ペアを超えた場合に、効率的なキーと値のペアを削除するためにどのような戦略を使用して適格なキーを削除するかを示します。 Redisの操作。

Redis の最大実行メモリ

メモリ削除メカニズムは、Redis の実行メモリが特定のしきい値に達した場合にのみトリガーされます。このしきい値は、設定した最大実行メモリです。この値は Redis 構成ファイルにあり、構成項目は です maxmemory

メモリ削除の実行プロセスは次の図に示すようになります。

写真

最大実行メモリを問い合わせる

コマンドを使用して config get maxmemory 、設定された最大実行メモリを表示できます。コマンドは次のとおりです。

127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"

この値は実際には 0 (64 ビット オペレーティング システムのデフォルト値) であることがわかりました。maxmemory が 0 の場合、メモリ サイズの制限がないことを意味します。

注: 32 ビット オペレーティング システムの場合、デフォルトの最大メモリ値は 3GB です。

記憶除去戦略

Redis のメモリ削減戦略を表示する

config get maxmemory-policy 次のコマンドを使用して、現在の Redis メモリ削減戦略を表示できます 。

127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"

この Redis は、noeviction タイプのメモリ削除メカニズムを使用していることがわかります。これは、実行中のメモリが設定された最大メモリを超えた場合、データは削除されませんが、新しい操作に対してエラーが報告されることを意味します。

メモリ消去戦略の分類

Redis の以前のバージョンには、次の 6 つの排除戦略がありました。

  1. noeviction : データは削除されません。メモリが不十分な場合、新しい操作はエラーを報告します。Redis のデフォルトのメモリ削除戦略。

  2. allkeys-lru : キー値全体の中で最も長く未使用のキー値を削除します。

  3. allkeys-random : キー値をランダムに削除します。

  4. volatile-lru : 有効期限が設定されているすべてのキー値のうち、最も長く未使用のキー値を削除します。

  5. volatile-random : 有効期限が設定されたキー値をランダムに削除します。

  6. volatile-ttl : 以前に期限切れになったキー値の削除を優先します。

Redis 4.0 では、2 つの新しい排除戦略が追加されました。

  1. volatile-lfu : 有効期限が設定されているすべてのキー値のうち、最も使用されていないキー値を削除します。

  2. allkeys-lfu : キー値全体から最も使用されていないキー値を削除します。

これは、 allkeys-xxx すべてのキー値からデータを削除することを意味し、 volatile-xxx 有効期限が切れたキーが設定されているキー値からデータを削除することを意味します。

Redis のメモリ削除戦略を変更する

メモリ削減戦略を設定するには 2 つの方法がありますが、どちらの方法にも独自の長所と短所があり、ユーザーは自分でそれらを比較検討する必要があります。

  • 方法1:「config set maxmemory-policypolicy」コマンドで設定します。メリットは設定後すぐに有効になり、Redisサービスを再起動する必要がないことですが、デメリットはRedisを再起動すると設定が無効になってしまうことです。

  • 方法 2: Redis 構成ファイルを変更して「maxmemory-policy ポリシー」を設定します。利点は、Redis サービスを再起動しても構成が失われないことです。欠点は、設定を有効にするために Redis サービスを再起動する必要があることです。 。

メモリ削除アルゴリズム

メモリ削除戦略の分類から、ランダム削除と削除なしに加えて、LRU 算法と の 2 つの主要な削除アルゴリズムがあることがわかりますLFU 算法

LRUアルゴリズム

LRU の正式名称は Least Recent Used で、訳すと「最も最近使用されていない」という意味で、最も長期間使用されていないページを選択して削除する、一般的に使用されているページ置換アルゴリズムです。

1. LRUアルゴリズムの実装

LRU アルゴリズムはリンク リスト構造に基づいている必要があります. リンク リストの要素は操作の順序に従って前から後ろに配置されます. 新しく操作されたキーはリストの先頭に移動します. メモリ消去の場合必要な場合は、リンクされたリストの末尾の要素のみを削除する必要があります。

2. ニア LRU アルゴリズム

Redis はメモリをより良く節約するために近似 LRU アルゴリズムを使用します. これは、このキー値の最終アクセス時刻を記録するために既存のデータ構造に追加フィールドを追加することによって実装されます. Redis メモリ 削除中に、データを削除するためにランダム サンプリングが使用されます.ランダムに 5 つの値を選択し (この値は構成可能)、最も長期間使用されていない値を削除します。

3. LRUアルゴリズムの欠点

LRU アルゴリズムには、長期間使用されていないキー値が最近アクセスされた場合、たとえ最も使用頻度の低いキャッシュであっても削除されないという欠点があります。の LFU アルゴリズムは Redis 4.0 以降に導入されました。一緒に見てみましょう。

LFUアルゴリズム

LFU の正式名は Least Frequently Used で、「最も一般的に使用されていない」という意味です。最も一般的に使用されていないアルゴリズムは、総訪問数に基づいてデータを削除します。その中心的な考え方は、「データが過去に何度もアクセスされている場合」です。 、将来的にはより頻繁にアクセスされるでしょう。「高」。

LFU は、時々アクセスされるとデータが削除されないという問題を解決し、LRU アルゴリズムよりも合理的です。

Redis の各オブジェクト ヘッダーには LFU 情報が記録されており、ソース コードは次のとおりです。

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    int refcount;
    void *ptr;
} robj;

Redis では、LFU ストレージは 16 ビット ldt (最終減分時間) と 8 ビット logc (ロジスティック カウンター) の 2 つの部分に分割されます。

  1. logcはアクセス頻度を格納するもので、8ビットで表現できる整数値の最大値は255です。値が小さいほど使用頻度が低く、排除しやすくなります。

  2. ldt は、logc の最終更新時刻を保存するために使用されます。

要約する

要約すると、Redis のメモリ削除戦略と期限切れの回復戦略は完全に異なる概念であることがわかりました。メモリ削除戦略は、Redis の実行メモリが大きすぎる問題を解決することです maxmemory 。 maxmemory-policy どのような種類の削除戦略を使用すればよいでしょうか? すでに存在します。 Redis 4.0 以降の 8 つの削除戦略. デフォルトの戦略では、 noeviction メモリが超過したときにキー値を削除しませんが、新しい操作ではエラーが報告されます。

Supongo que te gusta

Origin blog.csdn.net/LinkSLA/article/details/132540280
Recomendado
Clasificación