2012-01-06 9 views
0

DBにクエリを実行してユーザーにデータを返すJava Webservceがあります。 DBクエリは高価ですので、memcachedに現在のデータをキャッシュするたびに60秒ごとに実行されるCronジョブがあります。 データ要素は、「現在のデータの取得」要求によって返されないことを意味する時間の後に「閉じる」。したがって、これらの要求はキャッシュされたデータを利用できます。任意の時間差(Java Webサービス)のデータに差分をキャッシュするには

クライアントは特定のタイムスタンプ(最後のリクエストのタイムスタンプ)以降に変更されたすべてのデータを取得するために 'since'という機能を使用します。タイムスタンプ以降にデータが閉じられた場合、これは閉じられたデータを返します。

diffs/sinceデータを効果的に保存するにはどうすればよいですか?リクエスト以降のすべてのDBへのアクセスは遅すぎます(拡張がうまくいかないかもしれません)。しかし、クライアントは時間の経過とともにリクエストする可能性があるため、万能キャッシュを生成することが難しくなります。

私はcronジョブを持っているので、キャッシュを構築しようとしました。最後の更新以来変更されたすべてのものを要求した後、クライアントがcronジョブの要求と一致するタイムスタンプを要求するように強制しようとしました。しかし、cronがどれくらいの時間をかけてクライアントとコーンの仕事のどちらも正確に60秒ごとに実行されるという不一致があるので、小さな相違が加わります。この結果、最終的にはデータが閉じてしまいますが、キャッシュまたはクライアントがデータを失います。

私はこれを解決するために何を検索するかについてもわかりません。

答えて

1

データベースの前に期限切れのキャッシュ(たとえば、timeToLiveが設定されたehcache)を張り、データベースを更新したプロセスでもデータを直接キャッシュに置くことができます(既存の一致する要素をリセットまたは削除する)。 webserviceは、最初の接続を除いてすべての部分でキャッシュを(非常に高速です)ヒットします。余りにも古いいくつかの要素を除外し、残りをクライアントに送信します。古いデータは徐々にキャッシュから廃棄されます。次に、サービスの起動時にキャッシュが事前設定されていることを確認します。

+0

私は最近、Ehcacheが優れた検索可能な機能を持っていることを発見したので、DBのようなキャッシュソートを使用して、必要なレコードを見つけることができます。さらに、各レコードにタイムスタンプを付けるので、「それ以降」のレコードを検索することができます。あなたの考えはあまりにもうまくいくと思います。しかし、答えは間違いなくEhcacheです! – dontocsata

0

データにタイムスタンプが付いていますか?ここで私の会社でキャッシュしている間、私たちは同様の問題を抱えていました。タイムスタンプで解決しました。データに「有効期限」タイムスタンプを使用すると、キャッシュとクライアントがデータが有効であることを知ることができます。

+0

DBは、変更が行われるたびにデータをタイムスタンプします。これは、since要求に使用されるものです。私はあなたがバリデーション・アップを意味するかどうかはわかりません。データはリアルタイムで変化しており、クライアントは特定の時間以降に変更された内容を要求できる必要があるため、データの有効性にどのように関係しているかわかりません。 – dontocsata

+0

私が言いたいのは、あなたのデータと共に、もう1つのフィールド "Valid Upto"をクライアントとキャッシュに渡します。そのデータが有効でキャッシュされるまで知ることができます。 –