Redisキャッシュ有効期限切れポリシーキャッシュ淘汰ポリシーキャッシュ淘汰メカニズム


一、前言-有効期間
Redisは、現在最も一般的に使用されているオープンソースメモリデータベースとして非常にパフォーマンスが高いが、長期にわたってRedisをキャッシュとして使用すると、メモリ領域ストレージのボトルネックに遭遇することは避けられないため、保存されているデータに対しては一般的に有効期間を設定します.1つは空間を節約することであり、2つはデータの弱い一致性を実現し、有効期間が失効した後、データの一致性を保証することができる.
二、Redisの期限切れの策略
期限切れのポリシーには、次の3つがあります.1.期限切れ
  • 失効時間を設定するkeyごとにタイマを作成する必要があり、失効時間になるとすぐにクリアされます.このポリシーは、期限切れのデータをすぐに消去することができ、メモリに友好的です.しかし、大量のCPUリソースを消費して期限切れのデータを処理し、キャッシュの応答時間とスループットに影響を与える.
  •  setex('a', 300, 'aval')
     setex('b', 600, 'bval')

    2.不活性期限切れ
  • は、1つのkeyにアクセスした場合にのみ、そのkeyが期限切れであるか否かを判断し、期限切れであれば消去する.このポリシーは、CPUリソースを最大化して節約できますが、メモリに非常に友好的ではありません.極端な状況では、大量の期限切れkeyが再アクセスされず、クリアされず、大量のメモリが消費される可能性があります.

  • 3.定期期限切れ
  • は、一定の時間ごとに、一定の数のデータベースのexpires辞書の一定の数のkeyをスキャンし、期限切れのkeyを消去します.このポリシーは、前の2つの折衷スキームです.タイミングスキャンの間隔とスキャン毎の制限時間を調整することで、CPUとメモリリソースのバランスを最適化することができます.expires辞書には、キー空間内のキーを指すポインタであり、valueはキーのミリ秒精度のUNIXタイムスタンプで表される有効期限が設定されているキーの有効期限データがすべて保存されます.キー空間とは、Redisクラスタに保存されているすべてのキーを指します.

  • 三、キャッシュ淘汰eviction
    Redisは、本番環境で構成パラメータmaxmemoryを用いてメモリサイズを制限します.実際のメモリがmaxmemoryパラメータ値を超えた場合、開発者たちは、これらの方法であるRedisメモリ淘汰ポリシーを使用して、新しい空間を空けて読み書き作業を継続する方法を決定することができます.1.Redisキャッシュ淘汰ポリシーワークフロー
  • まず、クライアントはより多くのメモリを必要とする申請を開始します.
  • 次に、Redisはメモリの使用状況をチェックし、実際の使用メモリがmaxmemoryを超えている場合、Redisはユーザー構成の淘汰戦略に基づいて不要なkeyを選択する.
  • 最後に、選択したデータに問題がないことを確認し、淘汰タスクを成功裏に実行した.

  • 2. Redis3.バージョン0のサポート・トーナメント・ポリシーは6種類あります
  • no-eviction:メモリが新しい書き込みデータを格納するのに不足している場合、新しい書き込み操作はエラーを報告します.
  • allkeys-lru:新しい書き込みデータを格納するためにメモリが不足している場合、キースペースで最近最も使用されているkeyを削除します.
  • allkeys-random:新しい書き込みデータを格納するためにメモリが不足している場合、キー空間でキーをランダムに削除します.
  • volatile-lru:新しい書き込みデータを格納するためにメモリが不足している場合、有効期限が設定されているキースペースで、最近最も少ないkeyを削除します.
  • volatile-random:新しい書き込みデータを格納するためにメモリが不足している場合、有効期限が設定されているキースペースからキーをランダムに削除します.
  • volatile-ttl:メモリが新しい書き込みデータを格納するのに不足している場合、有効期限が設定されているキースペースに、より早い有効期限が設定されているkeyが優先的に削除されます.

  • 3.Redisがサポートする6種類の淘汰戦略の選択
  • Redisでは,データの一部がアクセス頻度が高く,残りの部分がアクセス頻度が低く,あるいはデータの使用頻度を予測できない場合にallkeys-lruを設定するのが適切である.
  • すべてのデータアクセス確率がほぼ等しい場合、allkeys-randomを選択できます.
  • 研究開発者が異なるttlを設定することによってデータの期限切れの前後順序を判断する必要がある場合、volatile-ttlポリシーを選択することができる.
  • いくつかのデータが長期にわたって保存され、いくつかのデータが淘汰されることを望む場合は、volatile-lruまたはvolatile-randomを選択するのが良いです.
  • expireを設定すると余分なメモリが消費されるため、Redis内にこのような無駄がないように計画する場合は、allkeys-lruポリシーを選択すると、期限切れを設定せずにメモリを効率的に利用できます.

  • 四、Redis淘汰メカニズム
    1.LRU淘汰
  • LRU(Least recently used、最近最小使用)アルゴリズムは、データの履歴アクセスレコードに基づいてデータを淘汰し、「データが最近アクセスされた場合、将来アクセスされる確率も高い」という核心思想を持っている.
  • 基本構想:
  • 新しいデータがリストヘッダに挿入される.
  • キャッシュヒット(すなわち、キャッシュデータがアクセスされる)毎に、データはリストヘッダに移動する.
  • リストがいっぱいになったら、リストの末尾のデータを破棄します.

  • サーバ構成にはlruカウンタserverが格納.lrulock,会定時(redis定時プログラムserverCorn()更新,server.lrulockの値はserver.Unixtimeはソートのために計算し、最近使用時間が最も長いデータを選択して削除します.また、struct redisObjectから、各redisオブジェクトに対応するlruが設定されていることがわかります.データにアクセスするたびに、対応するredisObjectが更新されます.lru.

  • 2.TTL淘汰
  • Redisデータセットデータ構造には、キー値対の期限切れ時間のテーブルであるredisDbが保存する.expires.LRUデータ淘汰メカニズムと同様に、TTLデータ淘汰メカニズムでは、期限切れのテーブルからランダムにいくつかのキー値ペアを選択し、ttl最大のキー値ペア淘汰を取り出します.同様に、TTL淘汰ポリシーは、すべての期限切れのテーブルの中で最も早く期限切れになったキー値ペアではなく、ランダムに選択されたいくつかのキー値ペアにすぎない.

  • 3.ランダム淘汰
  • ランダムに淘汰されたシーンで削除されるキー値ペアを取得し、ランダムにhashバケツが再びhash指定位置のdictEntryを探せばよい.

  • 参考資料:https://www.jianshu.com/p/b1b4eeccc140