sql >> データベース >  >> NoSQL >> Redis

サーバー側でのJSONオブジェクトのキャッシュ

    memcachedを使用することもできますが、やはり誰もがデータベースサーバーにアクセスします。あなたの場合、クエリ結果は一種の永続的であると言っています そのため、WebサービスからのJSON応答をキャッシュする方が理にかなっている場合があります。

    これは、キャッシュが組み込まれたリバースプロキシを使用して実行できます。例は、Jetty(Java)とNGINXでそれを行う方法に最も役立つと思います:

    このセットアップでは、モバイルクライアント用のAPIを提供するJetty(Java)インスタンスがあります。 APIはlocalhost:8080 / apiをリッスンし、ローカルMysqlデータベースの一部のクエリからフェッチされたJSON結果を返します。

    この時点で、APIをクライアントに直接提供できますが、ここにリバースプロキシがあります:

    APIの前にNGINXWebサーバーがあり、0.0.0.0:80 /(どこでもポート80)からリッスンしています。モバイルクライアントが0.0.0.0:80/apiに接続すると、組み込みのリバースプロキシがから正確なクエリ文字列をフェッチしようとします。それはキャッシュです。これが失敗した場合は、localhost:8080 / apiからフェッチし、キャッシュに入れて、キャッシュで見つかった新しい値を提供します。

    メリット:

    • 他のNGINX機能を使用できます:キャッシュされたJSONファイルの自動GZIP圧縮
    • NGINXでのSSLエンドポイントの終了。
    • NGINXワーカーは、接続数が多く、すべてがキャッシュからデータを要求している場合に役立つ可能性があります。
    • サービスエンドポイントを統合できます

    キャッシュの無効化について考えてみましょう:

    キャッシュの無効化について考える必要があります。 NGINXにキャッシュを保持するように指示できます。たとえば、localhost:8080 /apiのすべてのHTTP200リクエストの場合は1週間、その他のすべてのHTTPステータスコードの場合は1分間保持します。ただし、1週間以内にAPIを更新する時期が来た場合、キャッシュは無効であるため、何らかの方法でそれを削除するか、キャッシュ時間を1時間または1日に短縮する必要があります(ほとんどの人がキャッシュ)。

    これが私たちの仕事です。キャッシュが汚れている場合は、キャッシュを削除することにしました。 Update-APIイベントをリッスンしているサーバーで別のJOBを実行しています Puppetを介してトリガーされます。 JOBがNGINXキャッシュのクリアを処理します。

    もう1つのアイデアは、Webサービス内にキャッシュのクリア機能を追加することです。このソリューションに反対した理由は次のとおりです。Webサービスは、リバースプロキシの背後で実行されていることを認識している必要があり、関心の分離が破られます。しかし、それはあなたが何を計画しているかによります。

    もう1つ、Webサービスをより正しくすることができます。 各JSONファイルで正しいETAGおよびcache-expiresヘッダーを提供することになります。繰り返しになりますが、ファイルごとに小さなイベントではなく、大きな更新イベントが1つあるため、これは行いませんでした。

    サイドノート:

    • NGINXを使用する必要はありませんが、設定は非常に簡単です
    • NGINXとApacheはSSLをサポートしています
    • 有名なリバースプロキシ(https://www.varnish-cache.org)もありますが、私の知る限り、SSLは実行しません(まだ?)

    したがって、Webサービス+ SSLの前でVarnishを使用する場合は、NGINX->Varnish->Webサービスのような構成を使用します。

    参照:-NGINXサーバー:http://nginx.com- Varnishリバースプロキシ:https://www.varnish-cache.org- Puppet IT Automation:https://puppetlabs.com- NGINXリバースプロキシチュートリアル:http:/ /www.cyberciti.biz/faq/howto-linux-unix-setup-nginx-ssl-proxy/ http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html




    1. 接続ごとに新しいRedisクライアントを作成する必要がありますか?

    2. MongoDB現在のユーザーを表示

    3. PyMongoを使用してPandasデータフレームをmongodbに挿入します

    4. Socket.io、RedisストアおよびIE