Redis キャッシュの削除戦略について話しましょう

青灯夜游
リリース: 2021-10-27 10:25:30
転載
1749 人が閲覧しました

Redis キャッシュの削除戦略は何ですか?この記事では、Redis のキャッシュ削除戦略について説明し、キャッシュ戦略設定の提案を紹介します。

Redis キャッシュの削除戦略について話しましょう

リモート辞書サービスである Redis (Remote Dictionary Server) は、ANSI C 言語で書かれたオープン ソースのログ タイプで、ネットワークをサポートしており、メモリや永続性、Key-Value データベースを備え、複数の言語で API を提供します。 [関連する推奨事項: Redis ビデオ チュートリアル ]

これには次の特徴があります:

  • メモリに基づいて実行され、高いパフォーマンス機能を備えています
  • キー/値ストレージ構造の分散型で理論上無制限の拡張をサポートし、効率的なクエリ
  • は複数の開発言語 API を提供し、既存のビジネス システムとの統合が容易です。

通常、ビジネス システムで分散キャッシュ、集中セッション ストレージ、分散ロック、その他のアプリケーション シナリオに使用されます。

ローカル キャッシュでも分散キャッシュでも、より高いパフォーマンスを確保するために、データを保存するためにメモリが使用されます。コストとメモリの制限により、保存されたデータがキャッシュ容量を超える場合、キャッシュされたデータはキャッシュされる。一般的な削除戦略には、最も古いデータを削除する FIFO、最も最近使用されていないデータを削除する LRU、および最も最近使用されていないデータを削除する LFU が含まれます。

Redis キャッシュ削除ポリシー トリガー

運用環境では、Redis にスワップ動作を許可しません。したがって、最大メモリ使用量は一般に制限されており、Redis では最大メモリ使用量を指定するための構成パラメータ maxmemory が提供されています。

次の構成は有効です:

maxmemory 1000KB 
maxmemory 100MB 
maxmemory 1GB 
maxmemory 0  # 表示不做限制,一般不会用
ログイン後にコピー

redis.conf 構成ファイルは次のとおりです

Redis キャッシュの削除戦略について話しましょう

#8 8 Redis キャッシュ戦略

  • volatile-lru はタイムアウトを設定してデータの中で最も使用頻度の低いデータを削除します;

  • allkeys-lru はすべてのキーをクエリします 削除データ内で最も使用頻度の低いデータ。これは最も広く使用されている戦略です。

  • volatile-random はタイムアウトを設定したデータをランダムに削除します。
  • allkeys-random はすべてのクエリを実行します。
  • volatile-ttl は、設定されたタイムアウトですべてのデータをクエリし、すぐに並べ替えて、期限切れが近づいているデータを削除します。
  • noeviction (デフォルト) に設定されている場合この属性では、削除操作は実行されず、メモリがオーバーフローした場合はエラーが返されます。
  • volatile-lfu は、有効期限が設定されたすべてのキーから最も使用頻度の低いキーを削除します。;

  • #allkeys-lfu は、すべてのキーから最も使用頻度の低いキーを削除します。
##Redis ベースの LRU および LFU アルゴリズム

##LRU アルゴリズム

Redis LRU アルゴリズムは正確な実装ではありません。これは、Redis が best

エビクション候補

、つまり過去に最も多くのアクセスを行った候補を選択できないことを意味します。代わりに、少数のキーをサンプリングし、サンプリングされたキーのうち最良の (アクセス時間が最も早い) キーを排除することによって、LRU アルゴリズムの近似を実行しようとします。 ただし、Redis 3.0 以降では、アルゴリズムが改善され、エビクションに適した候補をいくつか選択できるようになりました。これによりアルゴリズムのパフォーマンスが向上し、実際の LRU アルゴリズムの動作にさらに近づけることができます。 Redis LRU アルゴリズムで重要なのは、エビクションごとにチェックするサンプルの数

を変更することで、

アルゴリズムの精度を

調整できることです。このパラメーターは、次の構成ディレクティブによって制御されます。

maxmemory-samples 5
ログイン後にコピー
Redis が真の LRU 実装を使用しない理由は、より多くのメモリが必要になるためです。ただし、Redis を使用するアプリケーションの場合、近似は実際には同等です。以下は、Redis で使用される LRU 近似値と実際の LRU の比較表です。

#上記のグラフを生成するテストでは、Redis サーバーに指定された数のキーを設定します。キーは最初から最後までアクセスされるため、最初のキーが LRU アルゴリズムを使用したエビクションの最適な候補となります。その後、古いキーの半分を強制的に削除するために、さらに 50% のキーが追加されました。

画像には 3 種類の点があり、3 つの異なるバンドを形成していることがわかります。 Redis キャッシュの削除戦略について話しましょう

薄灰色のバンドは、排除されたオブジェクトです。

灰色のバンドは、排除されていないオブジェクトです。

  • #緑のバンドは追加されたオブジェクトです。
  • 理論的な LRU 実装では、古いキーのうち前半が期限切れになることが予想されます。 Redis LRU アルゴリズムは、古いキーを
の確率
    でのみ期限切れにします。
  • LRU は、特定のキーが将来アクセスされる可能性を予測するモデルにすぎません。さらに、データ アクセス パターンがべき乗則によく似ている場合、ほとんどのアクセスは LRU 近似アルゴリズムが適切に処理できるキー セット内になります。

欠点: 大量のホット データを生成するために、一定期間内に大量のコールド データにアクセスする可能性があります。

LFU 算法

从 Redis 4.0 开始,可以使用新的最不常用驱逐模式。这种模式在某些情况下可能会更好(提供更好的命中率/未命中率),因为使用 LFU Redis 会尝试跟踪项目的访问频率,因此很少使用的项目会被驱逐,而经常使用的项目有更高的机会留在记忆中。

如果您认为在 LRU,最近访问过但实际上几乎从未被请求过的项目不会过期,因此风险是驱逐将来有更高机会被请求的密钥。LFU 没有这个问题,一般应该更好地适应不同的访问模式。

配置LFU模式,可以使用以下策略:

  • volatile-lfu 在具有过期集的键中使用近似 LFU 驱逐。
  • allkeys-lfu 使用近似 LFU 驱逐任何密钥。

LFU 类似于 LRU:它使用一个概率计数器,称为莫里斯计数器,以便仅使用每个对象的几位来估计对象访问频率,并结合衰减周期,以便计数器随着时间的推移而减少:在某些时候,我们不再希望将密钥视为经常访问的密钥,即使它们过去是这样,以便算法可以适应访问模式的转变。

这些信息的采样与 LRU 发生的情况类似(如本文档的前一部分所述),以便选择驱逐的候选人。

然而,与 LRU 不同的是,LFU 具有某些可调参数:例如,如果不再访问频繁项,它的排名应该以多快的速度降低?还可以调整 Morris 计数器范围,以便更好地使算法适应特定用例。

默认情况下,Redis 4.0 配置为:

  • 在大约一百万个请求时使计数器饱和。
  • 每一分钟衰减一次计数器。

这些应该是合理的值并经过实验测试,但用户可能希望使用这些配置设置以选择最佳值。

有关如何调整这些参数的说明可以redis.conf在源代码分发的示例文件中找到,但简单地说,它们是:

lfu-log-factor 10 
lfu-decay-time 1
ログイン後にコピー

衰减时间是显而易见的,它是计数器应该衰减的分钟数,当采样并发现它比该值更旧时。一个特殊值0意味着:每次扫描时总是衰减计数器,很少有用。

计数器对数因子会改变需要多少次命中才能使频率计数器饱和,这恰好在 0-255 的范围内。系数越高,需要越多的访问以达到最大值。根据下表,系数越低,低访问计数器的分辨率越好:

+--------+------------+------------+------------+------------+------------+
| factor | 100 hits   | 1000 hits  | 100K hits  | 1M hits    | 10M hits   |
+--------+------------+------------+------------+------------+------------+
| 0      | 104        | 255        | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 1      | 18         | 49         | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 10     | 10         | 18         | 142        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 100    | 8          | 11         | 49         | 143        | 255        |
+--------+------------+------------+------------+------------+------------+
ログイン後にコピー

淘汰最近一段时间被访问次数最少的数据,以次数作为参考。

缺点:

1. 最近加入的数据常常容易被剔除,因为其起始方法次数比较少,

2. 如果频率时间度量为 1 个小时,则平均一天每个小时内访问频率 1000 的热点数据可能会被 2个小时的一段时间访问的频率为 1001 的数据剔除掉。可能会出现一些临界值的数据。

缓存策略设置建议

建议:了解Redis 的淘汰策略之后,在平时使用尽量主动设置/更新 key 的 expire 时间主动剔除不活跃的旧数据, 有助于提升查询性能

更多编程相关知识,请访问:编程入门!!

以上がRedis キャッシュの削除戦略について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート