2015-11-06 4 views
8

イントロ:私は戻って、フロントエンドの角度アプリを供給し、バックエンドの複雑かつ長期的なクエリを持ってキャッシュの無効化と同期角度/バックエンドあまりに

現在、角度アプリは、複雑なクエリから直接読み取るのではなく、バックエンドでキャッシュされたデータを使用します。これには数分かかります。キャッシュは毎朝、毎晩暖かくなります。

ユーザーがuiを変更し、データを保存してからサーバー側に渡してデータベースに保存するとき。その時点で、ユーザーがページを更新するまで、UIは最新の状態になります。同時に、データベースは最新ですが、キャッシュは古くなっています。

したがって、ユーザーがページをリフレッシュすると、無効なキャッシュ値がページに表示されます。

さらに詳しい情報:

私は今、キャッシュを更新する方法を考えています、そしてより多くの経験を積んだ人たちから何かアドバイスは大歓迎だろう。

私の考えは、キャッシュジョブ(一度に1つ)でキャッシュをリフレッシュすることです。これは、ユーザーが何かを保存するとすぐにキューに入れられます。ジョブは変更された関連情報を持ち、キャッシュ全体を再計算する必要はなく、変更されたビットだけを再計算する必要があります。

質問の一部:私は、ユーザーがページをリフレッシュしても、データを最新の状態にユーザーを維持するために使用することができますどのような技術

?データがサーバーに送信されるときに、クライアント側で 'deltas'をindexedDBまたはlocalstorageの形式で保存する必要があります。したがって、ページがリフレッシュされると、ユーザーはローカルストレージまたは索引付けされたデータベースからデータを読み取ります。

私はまだこのトラフを考えていますが、明らかに私はこれまで多くの経験がありませんでした。

基本的には、バックエンド/フロントエンド/キャッシュを含む何かを変更することはできますが、これはPOC段階にあります。他の人のためにできるだけ多くの情報を得ようとしています。

更新

もう少し背景。私はページのようなインデックスに取り組んでいるので、インラインで編集できる複数のレコードがあります。

また、構造のようなマップにダンプしてjsonの形式でフロントエンドに渡す前に、バックエンドでフラットDBレコードの一部の変換を行っています。

+0

ユーザーが変更や保存を行った場合、更新時にこれらのデータベース値を要求するのはなぜですか? –

+0

私は最も簡単な方法は、キャッシュが作成された時間を知っていることを確認することだと思います。変更を加えたら、キャッシュの時間とともに、ページの現在の状態をlocalStorageに保存します。ページをロードすると、キャッシュされたデータが取得されます。ローカルストレージのバージョンより新しいかどうかを確認します。キャッシュされている場合は、キャッシュを使用してください。そうでない場合は、キャッシュされたデータに変更が加えられているので、localStorageからデータをリロードしてください。 – dave

+0

あなたが言うことは、キャッシュよりもデータ変換の仕事に似ています。あなたがサーバー側でやっていることを詳しく説明することは役に立ちます。 – zeroflagL

答えて

3

私は、キャッシュが作成された時間を知っていることを確認するのが最も簡単な方法だと思います。変更を加えたら、キャッシュの時間とともに、ページの現在の状態をlocalStorageに保存します。ページをロードすると、キャッシュされたデータが取得されます。ローカルストレージのバージョンより新しいかどうかを確認します。キャッシュされている場合は、キャッシュを使用してください。そうでない場合は、キャッシュされたデータに変更が加えられているので、localStorageからデータをリロードしてください。

+0

と、複数のユーザーがデータを変更すると、それぞれがローカルストレージにアプリケーションの独自の状態を持ちます。 – AdamSkywalker

2

あなたの質問は長すぎます、私は事実を要約しましょう。あなたは

  • 直接検索クエリは、ユーザーがデータを変更すると1日2回
  • を更新されたキャッシュを使用し、高速な検索を提供するために、数分
  • をとり、データベースに多くの情報を持っている

    1. 、データベースが更新され、キャッシュがないため、Webページに古い情報がキャッシュから表示されます。

    これは、シナリオを使用した一般的なキャッシュのように見えます。解決策は明らかです。データベースが変更されるとすぐに、デルタでキャッシュを更新する必要があります。実際の実装は、アプリケーションのアーキテクチャとキャッシュ構造によって異なります。

    問題の典型的なワークフローは次のようになります。

    def updateRequest(Request req) { 
        def tx = db.startTransaction(); 
        tx.execute(createUpdate(req.getData())); 
        tx.commit(); // if transaction fails, cache is not updated 
        cache.update(req.getData()); // can be done in background, if you return delta 
    } 
    
  • 0

    あなたがテーブルにデータを格納しているようだと、あなたのindex.htmlをレンダリングするためにJSON構成を構築するために複雑なクエリと、それらのテーブルを使用しますファイル。テーブルを避け、NoSQLソリューションを使用することで、この問題を回避しました。私はクライアント側でJSON構成オブジェクトを構築し、そのJSON構成オブジェクトをNoSQLコレクションに格納します。 URLを使用してJSON設定オブジェクトを取得し、index.htmlファイルをレンダリングする簡単なクエリを実行します。

    AWS DynamoDBでJSON設定オブジェクトを保存した経験が少しありました。高速化が必要な場合は、おそらくAWS ElastiCacheに切り替えることになります。

    重要な点は、サイトのホスト名やその他のベースURLのような便利なキーを使用してJSON設定オブジェクトをキャッシュし、それをindex.htmlレンダリングの真実のソースとして使用する必要があることです。

    +0

    提案していただきありがとうございますが、データベースを変更することは、この時点でnogoです –