質問

私にはサーバーのファームがあり、各サーバーは定期的にデータベースと同じクエリを作成しています。これらのクエリの結果は、すべてのサーバーがアクセスできる共有キャッシュでキャッシュされます。

新しいクエリが古いクエリによって上書きされないようにするにはどうすればよいですか?たとえば、これが起こらないように、何らかの形でクエリをバージョンする方法はありますか?同時クエリに対処する方法は?

ありがとう!

編集:DBはSQL Serverです。クエリはSELECTステートメントです。また、キャッシュメカニズムは非常にシンプルです。ロックなしで簡単な書き込みです。そして、それは現在、選択クエリの順序を伝える方法がないからです。

役に立ちましたか?

解決

1つのアプローチは、更新または読み取りの場合、データベースにグローバル更新カウンターを持つことです(更新はより効率的ですが、適切にするのは難しいです)。

そのため、各更新では、グローバルカウンターも増加します。各読み取りで、グローバルカウンターを読み取り、カウンター値とともにデータをキャッシュに入れます。カウンター値が大きい場合にのみ、キャッシュの内容を上書きします。

データベースの分離のため、トランザクションはシリアル方法で発生したかのように表示されるはずです(シリアル化可能な分離レベルを選択したと仮定します)。これは、厳密に高いカウンター数がより最近のデータに関連していることを意味します。

他のヒント

キャッシュはどこにありますか?ディスクファイルですか?またはデータベースのテーブル?

そして、古いクエリが新しいものを上書きするかもしれないと言うとき、それはどういう意味ですか?最も完璧なクエリ(またはおそらく最も有意に起動されたもの)が最新のクエリであるというのは本当ではありませんか?

ファイルであろうとテーブルであろうと、各クエリを実行する前に、キャッシュコンテナをロックする必要があります。各サーバーは、ロックを取得できる場合にのみクエリを実行する必要があります。そうしないと、ロックされたリソースが待機する必要があります。そうすれば、キャッシュには最新の結果のみが含まれます。

それはあなたが尋ねていることの線に沿っていますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top