2016-04-20 4 views
1

Redisキャッシュに複数のバージョンを格納するために必要な製品データがあります。データはJSONシリアル化されています。プレーンな(基本的な)データを取得するプロセスは高価であり、異なるバージョンにカスタマイズするプロセスもコストがかかるため、可能な限り最適化するためにすべてのバージョンをキャッシュしたいと考えています。カスタマイズが単一のパラメータに基づいており、そのパラメータをキャッシュキーの一部として使用できるとします。私は、製品データを取得するために使用することを計画していた複数のバージョンのデータをRedisキャッシュに保存

プロセスは、このようなものです:

if cache contains appropriately customised data for this parameter 
    return customised data from cache 
else 
    if cache contains basic data 
     get basic data from cache 
    else 
     get basic data from primary data source (expensive) 
     save basic data to cache for next time 

apply customisations to basic data (expensive) 
save customised version to cache, using the parameter as a key 
return customised product 

このすべてがうまく動作しますが、私は今、時にキャッシュデータを無効化する最善の方法をうまくしようとしています基になるデータソースが変更されます。基本的な製品情報が変更された場合、カスタマイズされたすべてのバージョンも期限切れにする必要があります。これが起こる必要があるときに私は通知を受けるでしょう。

製品のカスタマイズに使用されるパラメータは、簡単には列挙できません。可能なパラメータが多数あるため、すべての可能なキーを反復処理することは実現不可能です。

Redisは、ワイルドカードを使用して複数のキーを有効期限切れにする機能を提供していないようで、Redisパターンを見回しているので、私はこれが正しい方法に近づいているとは確信していません。

Redisのこのようなカスタマイズされた半階層データを有効期限切れにするためのよりよい方法はありますか?

+0

ハッシュを使用して、製品のデータ/ドキュメントのすべてのバージョンを保存できます。無効にするには、そのキーを削除するだけです(それに格納されているすべてのバージョンが1つになってしまいます)。 –

+1

ありがとう!それがまさに私が探しているものです。あなたが答えにあなたのコメントをするなら、私はそれを受け入れるでしょう。 – John

答えて

0

Redis 'Hashは、お客様のニーズに適しています。その製品のバージョンを、その製品のハッシュキーにフィールドの値として格納することができます。たとえば:

HSET id:14 1 "{your JSON data v1}" 

フェッチバージョンは、単に製品のキーと関連する分野でHGETを呼んでいます。無効にするには、DELおよび/またはEXPIREハッシュ全体を無効にします。

+0

ありがとうございます。私はまた、この質問で概説したシナリオが最初のステップに過ぎないことを認識しました。私は[別の質問で説明した]もっと複雑な状況があります(http://stackoverflow.com/questions/36743354/how-to-invalidate - 階層のツリーの一部 - データ - レディス - キャッシュ - レディス - キャッシュ)。 – John

関連する問題