Redisの中リストとセットの取り扱いのためのベストプラクティスは何ですか?
-
27-09-2019 - |
質問
私たちは、キャッシュサーバとしてのRedisを使用して、多くの場合、リストをキャッシュに対処する必要がありますされています。私たちは、単純なオブジェクトをキャッシュするとき、我々はGETを行うと、オブジェクトが存在しない場合はRedisのはNULLを返し、私たちは、オブジェクトがキャッシュされていないことを知っていると、データベースからロードする必要があります。
しかし、どのように我々は最高のリストのための同じを扱うん - 空のリストは、有効な値にすることができます。我々は、コールする必要がありますリストが存在するかどうかを確認するために存在する(代わりに1の操作2の呼び出しを行う)、または誰かが?このシナリオを処理するために、どのようにより良いアイデアを持っているん
/おかげ
解決
は、リストが作成されたときに削除されることはありません最初の要素として「センチネル」をプッシュすることができます。これを行うためにアトミックあなたはMULTI / EXEC / WATCHを使用することができますが、時計が(でも、かなり安定している場合、あなたはgithubのマスターブランチからそれをつかむことができます)現在のプレビューであることのRedis 2.2でのみ使用可能です。
私が思うあなたのユースケースであなたもアトミックがすでに存在する場合にのみ、リストに対してプッシュしますRPUSHXとLPUSHXを、場合もあります。
ゼロ要素に到達するリストが自動的に削除されるようにRedisの2.2以降多くの良い上の理由から、リストするための少なくとも1つの元素を有するようにする手段を存在することに注意してください。)
他のヒント
残念ながら、そのようなLRANGEやSMEMBERSとしてリスト/セット検索コマンドは空のリスト/セットおよび非存在リスト/セットを区別していないようです。
あなたは絶対に2例を区別する必要がある場合は、だから、私はあなたが最初にEXISTS行う必要がありますね。パフォーマンス向上のため、あなたのコマンドをパイプライン化してみてください。ほとんどのRedisのクライアントライブラリは、パイプライン化をサポートしています。
あなたがそれらを区別する必要がないように、またはあなたのキャッシュ戦略を再考するかもしれません。
あなたがPHPを使用している場合、私は変数に戻り値を割り当てますし、それが配列であるかどうかを確認します。
(これはPredisライブラリを使用してどのように動作するかです)$res = $redis->get('Key');
if(is_array($res))
do code here