0

私は、すべての API 呼び出しに対して非常に大規模なキャッシュ システムを用意しています。すべてのコマンドと要求パラメーター、および特定のタイムアウトから一意のフィンガープリントが作成されます。

要求が行われ、許容可能なキャッシュ タイムスタンプが割り当てられない場合、キャッシュが返されずに要求が行われるため、プログラムはすべてを単独で実行します。この結果は、新しいタイムスタンプとともにキャッシュに保存されます。

リクエストが行われ、リクエストが 5 分間のキャッシュを受け入れても構わないと定義している場合 (システムがそのようなものを見つけた場合)、システムはキャッシュから結果を返します。

つまり、各キャッシュ レコードには、キー (一意のフィンガープリント)、結果、作成時のタイムスタンプが含まれます。

現在、キャッシュはファイルシステムに保存されており、タイムスタンプはファイルの変更時刻であるため、負荷が高いと致命的な I/O 要求が発生します。

複数の記事を読んで、これらの呼び出しを減らすために Memcache と Memcached が推奨されていることに気付きました。

ただし、Memcache と Memcached はフィンガープリントと値のみを保存します。タイムスタンプはありません。技術的には、オンデマンド キャッシュのタイムスタンプの受け入れと柔軟性が失われることを意味します。技術的には、キャッシュごとに 2 つのレコードの保存を開始する必要があります。

Fingerprint-data と Data Fingerprint-time と Timestamp

..汚れているようです。代替手段はありますか?

4

1 に答える 1

1

作成時に、キャッシュされたオブジェクトがキャッシュ内でどのくらいの期間存続するかがわかっている場合、Memcachedには必要な機能があります。Memcache :: set関数には、と呼ばれるパラメーターがあり$expire、キャッシュされたオブジェクトの存続期間を秒単位で設定できます。

キャッシュからオブジェクトを取得するときの存続期間しかわからない場合、これは機能しません。キャッシュされたエンティティごとに2つのキーを使用することは現実的ではないことに同意します。これは、キャッシュが2つのキーの一方を失い、もう一方を保持する可能性があるためです。(まだ「ダーティ」ですが、より良い)解決策は、キャッシュに入れた各オブジェクトのタイムスタンプを保存することです。これを行うには、オブジェクトを直接キャッシュするのではなく、タイムスタンプとオブジェクトを含む配列をキャッシュします。

于 2012-05-24T09:57:42.067 に答える