一般的に、Redisには合計6つのキャッシュ除去戦略があります。その中で、一般的に使用されるallkeys-lruとvolatile-lruは、LRUの概念に言及しています。実際、LRUはキャッシュ除去戦略の基本的なアルゴリズムです。ここで、LRUは、今日話題になるトピックにつながります。LRU、LFU、およびFIFOアルゴリズムの原理を学び、キャッシュ除去戦略の真実を理解します。
文章
LRU、LFU、FIFOアルゴリズムの意味:
- FIFO:先入れ先出し、先入れ先出し、最も早いキャッシュオブジェクトを削除します。
- LRU:最も最近使用されていない、最も長く使用されていないデータを削除し、時間を参照します。
- LFU:使用頻度が最も低い、特定の期間内の訪問数が最も少ないデータを、参照としての回数で削除します。
これらのアルゴリズムは、さまざまなレベルのキャッシュで実行すると効率とコストが異なり、特定の状況に応じて最適なアルゴリズムを選択する必要があります。
1.FIFO _
FIFO(先入れ先出し)、先入れ先出し、この概念はキューキューでも言及されており、その基本原則は、データが最初にキャッシュに入る場合、できるだけ早く削除する必要があるということです。
最も一般的な実装は、二重にリンクされたリストを使用してデータを格納することです。
- 新しくアクセスされたデータはFIFOキューの末尾に挿入され、データはFIFOキュー内を順番に移動します。
- キャッシュがデータでいっぱいの場合は、キューの先頭にあるデータを削除してから、キューの最後に新しいデータを追加します。
- データにアクセスするときに、データがキャッシュに存在する場合は、対応する値の値が返されます。存在しない場合は、-1が返されます。
構造図は次のとおりです。
2.LRU
LRUは、時間を参照として使用し、最も長く使用されていないデータを削除することを意味します。核となる考え方は、データが最近アクセスされた場合、将来アクセスされる可能性が高くなるということです。
LRUは、最も一般的に使用される除去戦略でもあります。Redisでは、allkeys-lruでもvolatile-lruでも、基本的な原則は同じです。
最も一般的な実装は、リンクリストを使用してキャッシュされたデータを保持することです。
- 新しくアクセスされたデータは、リンクリストの先頭に挿入されます。
- キャッシュがヒットする(つまり、リンクリストデータにアクセスする)たびに、データはリンクリストヘッダーに再挿入されます。
- リンクリストがいっぱいになると、リンクリストの最後にあるデータ(異常なデータ)は破棄されます。
構造図は次のとおりです。
3.LFU
LFUとは、参照として使用される回数を意味し、一定期間内にアクセスされた回数が最も少ないデータが排除されます。基本的な考え方は、過去に何度もデータにアクセスされた場合です。 、将来的にはより頻繁にアクセスされる予定です。
- 新しく追加されたデータはキューの最後に挿入されます(参照カウントの初期値は1です)。
- キュー内のデータにアクセスすると、参照カウントは+1になり、キューは回数だけ並べ替えられます。
- データを削除する必要がある場合、ソートされたキューの最後(アクセスが最も少ない)のデータが削除されます。
構造図は次のとおりです。
補充:
1.2つのキュー(2Q)
この記事を読んだとき、誰かが2つのキュー(2Q)のアルゴリズムを導入しているのを見ました。ソースコードでは見つかりませんでしたが、原則に問題はありません。ここに追加されます。
2Qアルゴリズムは、2つのキュー(FIFOキューとLRUキュー)で構成されています。
- データに初めてアクセスするとき、データは最初にフロントFIFOキューに挿入されます。
- データがFIFOキューで再度アクセスされていない場合、FIFOルールに従って最終的に削除されます。
- FIFOキューでデータに再度アクセスすると、データはLRUキューの先頭に移動され、LRUルールに従って削除されます。