Redis キャッシュの削除戦略は何ですか?この記事では、Redis のキャッシュ削除戦略について説明し、キャッシュ戦略設定の提案を紹介します。
リモート辞書サービスである Redis (Remote Dictionary Server) は、ANSI C 言語で書かれたオープン ソースのログ タイプで、ネットワークをサポートしており、メモリや永続性、Key-Value データベースを備え、複数の言語で API を提供します。 [関連する推奨事項: Redis ビデオ チュートリアル ]
これには次の特徴があります:
通常、ビジネス システムで分散キャッシュ、集中セッション ストレージ、分散ロック、その他のアプリケーション シナリオに使用されます。
ローカル キャッシュでも分散キャッシュでも、より高いパフォーマンスを確保するために、データを保存するためにメモリが使用されます。コストとメモリの制限により、保存されたデータがキャッシュ容量を超える場合、キャッシュされたデータはキャッシュされる。一般的な削除戦略には、最も古いデータを削除する FIFO、最も最近使用されていないデータを削除する LRU、および最も最近使用されていないデータを削除する LFU が含まれます。
運用環境では、Redis にスワップ動作を許可しません。したがって、最大メモリ使用量は一般に制限されており、Redis では最大メモリ使用量を指定するための構成パラメータ maxmemory が提供されています。
次の構成は有効です:
maxmemory 1000KB maxmemory 100MB maxmemory 1GB maxmemory 0 # 表示不做限制,一般不会用
redis.conf 構成ファイルは次のとおりです
volatile-lru はタイムアウトを設定してデータの中で最も使用頻度の低いデータを削除します;
allkeys-lru はすべてのキーをクエリします 削除データ内で最も使用頻度の低いデータ。これは最も広く使用されている戦略です。
volatile-lfu は、有効期限が設定されたすべてのキーから最も使用頻度の低いキーを削除します。;
Redis LRU アルゴリズムは正確な実装ではありません。これは、Redis が best
エビクション候補、つまり過去に最も多くのアクセスを行った候補を選択できないことを意味します。代わりに、少数のキーをサンプリングし、サンプリングされたキーのうち最良の (アクセス時間が最も早い) キーを排除することによって、LRU アルゴリズムの近似を実行しようとします。 ただし、Redis 3.0 以降では、アルゴリズムが改善され、エビクションに適した候補をいくつか選択できるようになりました。これによりアルゴリズムのパフォーマンスが向上し、実際の LRU アルゴリズムの動作にさらに近づけることができます。 Redis LRU アルゴリズムで重要なのは、エビクションごとにチェックするサンプルの数
を変更することで、アルゴリズムの精度を
調整できることです。このパラメーターは、次の構成ディレクティブによって制御されます。maxmemory-samples 5
#上記のグラフを生成するテストでは、Redis サーバーに指定された数のキーを設定します。キーは最初から最後までアクセスされるため、最初のキーが LRU アルゴリズムを使用したエビクションの最適な候補となります。その後、古いキーの半分を強制的に削除するために、さらに 50% のキーが追加されました。
画像には 3 種類の点があり、3 つの異なるバンドを形成していることがわかります。
薄灰色のバンドは、排除されたオブジェクトです。
灰色のバンドは、排除されていないオブジェクトです。
欠点: 大量のホット データを生成するために、一定期間内に大量のコールド データにアクセスする可能性があります。 LFU 算法 从 Redis 4.0 开始,可以使用新的最不常用驱逐模式。这种模式在某些情况下可能会更好(提供更好的命中率/未命中率),因为使用 LFU Redis 会尝试跟踪项目的访问频率,因此很少使用的项目会被驱逐,而经常使用的项目有更高的机会留在记忆中。 如果您认为在 LRU,最近访问过但实际上几乎从未被请求过的项目不会过期,因此风险是驱逐将来有更高机会被请求的密钥。LFU 没有这个问题,一般应该更好地适应不同的访问模式。 配置LFU模式,可以使用以下策略: LFU 类似于 LRU:它使用一个概率计数器,称为莫里斯计数器,以便仅使用每个对象的几位来估计对象访问频率,并结合衰减周期,以便计数器随着时间的推移而减少:在某些时候,我们不再希望将密钥视为经常访问的密钥,即使它们过去是这样,以便算法可以适应访问模式的转变。 这些信息的采样与 LRU 发生的情况类似(如本文档的前一部分所述),以便选择驱逐的候选人。 然而,与 LRU 不同的是,LFU 具有某些可调参数:例如,如果不再访问频繁项,它的排名应该以多快的速度降低?还可以调整 Morris 计数器范围,以便更好地使算法适应特定用例。 默认情况下,Redis 4.0 配置为: 这些应该是合理的值并经过实验测试,但用户可能希望使用这些配置设置以选择最佳值。 有关如何调整这些参数的说明可以redis.conf在源代码分发的示例文件中找到,但简单地说,它们是: 衰减时间是显而易见的,它是计数器应该衰减的分钟数,当采样并发现它比该值更旧时。一个特殊值0意味着:每次扫描时总是衰减计数器,很少有用。 计数器对数因子会改变需要多少次命中才能使频率计数器饱和,这恰好在 0-255 的范围内。系数越高,需要越多的访问以达到最大值。根据下表,系数越低,低访问计数器的分辨率越好: 淘汰最近一段时间被访问次数最少的数据,以次数作为参考。 缺点: 1. 最近加入的数据常常容易被剔除,因为其起始方法次数比较少, 2. 如果频率时间度量为 1 个小时,则平均一天每个小时内访问频率 1000 的热点数据可能会被 2个小时的一段时间访问的频率为 1001 的数据剔除掉。可能会出现一些临界值的数据。 建议:了解Redis 的淘汰策略之后,在平时使用尽量主动设置/更新 key 的 expire 时间主动剔除不活跃的旧数据, 有助于提升查询性能 更多编程相关知识,请访问:编程入门!! 以上がRedis キャッシュの削除戦略について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。lfu-log-factor 10
lfu-decay-time 1
+--------+------------+------------+------------+------------+------------+
| 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 |
+--------+------------+------------+------------+------------+------------+
缓存策略设置建议