メモリがいっぱいRedisのであればどのようにしますか?

Redisのメモリフットプリントサイズ

私たちは、Redisのが原因でシステムの限られたメモリサイズの、メモリベースのキーと値のデータベースであることを知っているので、我々はRedisのを使用しているときのRedisを使用できる最大メモリサイズを設定することができます。

図1に示すように、プロファイルの構成

redis.conf、次の次の設定インストールディレクトリメモリサイズRedisのプロファイルを追加することにより

//設定された最大の占有Redisのメモリサイズは100Mです
maxmemory 100メガバイト
redis.confファイルのインストールディレクトリを使用していないRedisの設定ファイルは、起動時のRedisのサービスは、コンフィギュレーション・ファイルのRedisを指定するパラメータを渡すことができます

図2に示すように、コマンドを変更します

Redisのは、動的に実行コマンドのサポートにより、メモリサイズを変更します

//最大の占有率Redisのメモリサイズが100Mで設定
127.0.0.1:6379> maxmemory 100メガバイト構成の設定
、最大メモリサイズ// Redisのは、セットを使用することができます取得
127.0.0.1:6379>コンフィグGET maxmemoryを
最大メモリサイズやメモリサイズを制限しない64ビットオペレーティングシステムでは0に設定された最大メモリサイズを設定しない場合は、32ビットオペレーティングシステムでメモリ3ギガバイトを使い切ります

メモリのうちのRedis

あなたが最大の占有率Redisのメモリサイズを設定することができるので、メモリの構成は、時間が不足しています。ときにそれがメモリ不足でなく、追加していくのRedis何メモリの利用可能なデータは、それが存在していないですか?

Redisのは、実際にこのような状況に対処するためのいくつかの戦略を定義しています。

noeviction(デフォルトのポリシー):書込み要求の場合は、直接(要求しない限り、DELといくつかの特別な要求)エラーを返し、使用できなくなりました

allkeys-LRU:すべての鍵からLRUアルゴリズムを使用して行います

揮発性-LRU:セットからキーの有効期限をLRUアルゴリズムを使用して行います

allkeysランダム:ランダムからすべてのキーのデータのうち、

揮発性ランダム:ランダムに排除設定キー有効期限から

揮発性-TTL:キーに従って行っキーの有効期限時間の設定、有効期限は、早くより優先的に期限切れの解消します

揮発性ランダム揮発性-LRUを使用する場合、揮発性-TTLこれらの3つの戦略は、どのキーが存在しない場合は排除し、その後、同じエラーnoevictionを返すことができます

政策から抜け出すとメモリを設定する方法

現在のメモリ戦略から出て行け。

127.0.0.1:6379>コンフィグGET maxmemoryポリシー

(redis.confファイルを変更)コンフィギュレーションファイルを使用してポリシーの外に設定します:

maxmemoryポリシーallkeys、LRU

除去policyコマンドを変更します。

127.0.0.1:6379>コンフィグ設定maxmemoryポリシーallkeys、LRU

LRUアルゴリズム

LRUとは何ですか?

Redisの上でいえば、あなたはLRUアルゴリズムでは、メモリが不足して使用することができ、最大メモリ使用量が終わって使用することができ、その後、LRUアルゴリズムそれは何ですか?

LRUは、(最低使用)、それは、最低使用、キャッシュ置換アルゴリズムです。キャッシュメモリとして使用する場合、キャッシュサイズは、一般的に固定されています。キャッシュがいっぱいになると、この時間は内部キャッシュにデータを追加していくために、私たちは、古いデータの一部を排除し、新たなデータストレージ用メモリ領域を解放する必要があります。今度は、LRUアルゴリズムを使用することができます。核となるアイデアは、次のとおりです。データは最新の期間で使用されていない場合は、将来は非常に小さいの可能性を使用することですので、それを除去することができます。

シンプルなLRUアルゴリズムを実現するJavaを使用して

クラスLRUCacheの公共<K、V> { 
//容量
プライベートint型の容量、
どのように多くのノードであり、現在//の統計
プライベートint型COUNT;
//キャッシュノード
プライベート地図<K、ノード<K、V >>ノードマップ、
プライベート・ノード<K 、V>ヘッドと、
プライベート・ノード<K、V>尾;
公共LRUCache(INT容量){
IF(容量<1){
スロー新しい新しいはIllegalArgumentException(String.valueOf(容量));
}
this.capacity =容量;
this.nodeMap HashMapの新しい新しい= <>();
//、センチネルモデル低減テールノードと空のコードのヘッドノード使用して決定されるヘッドノードおよび末尾ノード初期化する
ノードのヘッドノードノード新しい新=(NULL、NULL);
ノード=新しい新しいtailNodeノード(NULL 、NULL);
headNode.next = tailNode;
tailNode.pre =ヘッドノード;
this.head =ヘッドノード;
this.tail = tailNode。
}
公共ボイドPUT(キーK、V値){
ノード<K、V> = nodeMap.getノード(KEY);
IF(ノード== NULL){
(COUNT> =容量)IF {
//最初のノードを削除
がremoveNode();
}
ノードノード新しい新しい= <>(キー、値);
//ノードを追加し
てaddNode(ノード);
}他{
//ヘッドノードにモバイルノード
moveNodeToHead(ノード);
}
}
パブリックノード<K、V> GET (キーK){
ノード<K、V> = nodeMap.getノード(KEY);
IF(ノード= NULL!){
moveNodeToHead(ノード);
}
ノードを返す;
}
プライベートボイドがremoveNode(){
ノードノード= tail.pre ;
//リストは、内部から除去される
。removeFromList(ノード)
nodeMap.remove(node.key)。
count--;
}
プライベートボイドremoveFromList(ノード<K、V>ノード){
ノードプリ= node.pre;
ノード次に= node.next;
pre.next =次に、
next.pre =プレ;
node.next = NULL;
= NULL node.pre;
}
プライベート空隙にaddNode(ノード<K、V>ノード){
//ヘッドにノードを追加
addToHead(ノード);
nodeMap.put(node.key、ノード);
COUNT ++;
}
プライベートボイドaddToHead(ノード<K、V>ノード){
ノード次に= head.next;
next.pre =ノードと
node.next =次に、
node.pre =ヘッド;
head.next =ノード;
}
公共ボイドmoveNodeToHead(ノード<K、V >ノード){
//リストは、内部から除去される
removeFromList(ノード);
//ヘッドへのノードの追加
addToHead(ノード)。
}
クラスノード<K、V> {
k個のキー。
V値。
ノード前;
次のノード;
パブリック・ノード(Kキー、V値){
this.key =キー。
this.value =値。
}
}
}
上記のコードは、単純なLURアルゴリズムを実装し、コードは非常にシンプルですが、また、ノート、理解しやすいです詳しく見を追加しました。

LRUは、Redisのを実現しています

おおよそLRUアルゴリズム

従来のLRUアルゴリズムでも同じではない近似LRUアルゴリズムを使用してのRedis。アウト近似LRUアルゴリズムデータ無作為抽出法、毎回ランダム5(デフォルト)最低使用頻度のうち内側からアウトキー、キー。

例:大きなmaxmemory-サンプル10 maxmenory-サンプル構成、アウト結果近い厳密LRUアルゴリズムサンプル数がmaxmemory-サンプルパラメータによって修正することができます

近似RedisのLRUアルゴリズムを実現するために、24ビットフィールドの各キーの余分な増加のために、キーが最後にアクセスしたために時間が保存さ。

LRUのRedis3.0最適化された近似

最適化のRedis3.0 LRUアルゴリズム概数。新しいアルゴリズムは、候補プール(サイズ16)、アクセス時間に従ってソートされたデータ・プールを維持し、最初のキーをランダムアクセス時間がプール未満である場合にのみ、ランダムに選択されたキーのそれぞれをプールに選択され、候補プールが満たされるまでプールに前の最小時間。満たされた場合には、存在する場合、最終アクセス時間の最大のプールを削除するには(最近アクセスし)、その後、新しいキーに配置する必要があります。

場合最近アクセス直接最小時間のプールから選択し、除去する必要は(最長がアクセスされていない)ライン上のキーを排除しました。

LRUアルゴリズムでコントラスト

私たちは、各LRUアルゴリズムの精度を比較した実験データnの一定数によって内部のRedisを追加する最初の、Redisの利用可能なメモリを使い切った、新しいデータのRedisを追加するために内部下るN / 2、あなたが一部を排除する必要があり、この時間することができますデータは、厳密なLRUアルゴリズムに従って、データが中、n / 2に参加する最初のを排除すべきです。図は、各LRUアルゴリズム(ソース)の次の比較を生成します。

考えてみて! インタビュアーは私に尋ねた:Redisのメモリを行う方法がいっぱいですか!

 

あなたは、ポイントは3つの異なる色であり、図を参照してくださいすることができます:

  • ライトグレーは、データの外にあります
  • グレイは、古いデータを排除していません
  • グリーンが新しく追加されたデータであり、

私たちは、サンプル数が厳格なLRUにRedis3.0最も近い10を生成している見ることができます。5サンプルの同じ数を使用しながら、Redis3.0も優れRedis2.8。

LFUアルゴリズム

LFUアルゴリズムは内部Redis4.0プラス新しいフェーズアウト戦略です。そのフルネームは最も使用頻度の低い、その核となるアイデアは、最近訪問したキーの優先順位の周波数に応じてほとんど解消されていないアクセスされ、それ以上は滞在してアクセスされた段階的に廃止することがあります。

LFUアルゴリズムがより良いアクセスされているキーの熱を表すことができます。あなたはLRUアルゴリズムを使用している場合は、長い時間のための鍵は、訪問されることはありません、たまにしか一度だけ訪れている、ホットデータであると考えられて解消されないだろう、といくつかの重要な将来にアクセスされる可能性が高いです排除されました。あなたはLFUアルゴリズムを使用している場合は1がホットデータであるキーを使用しないため、発生しません。

LFU 2つの戦略があります。

  • 揮発性-LFU:キーに設定された有効期限のうち、キーを使用してLFUアルゴリズム
  • allkeys-LFU:キーデータの全てにおける位相アウトを使用してLFUアルゴリズム
前と同じで話すの外に設定するこれら2つの戦略を使用しますが、注意すべきポイントは以下のRedis4.0で提供される場合、この戦略は唯一、Redis4.0の設定で2週間以上にできることであることは文句を言うだろう

問題

最後に、小さな問題を残して、何人かの人々ではなく、記事のコメント欄であなたの答えを与えることができ、正確なLRUアルゴリズムを使用してのRedisのおおよそのLRUアルゴリズムでは、我々は一緒に研究を議論し、なぜ私は説明していないことに気づいたかもしれません。

おすすめ

転載: www.cnblogs.com/longxok/p/11504911.html