9

キャッシュサーバーとしてRedisを使用しており、多くの場合、キャッシュリストを処理する必要があります。単純なオブジェクトをキャッシュする場合、GETを実行すると、オブジェクトが存在しない場合、Redisはnullを返します。オブジェクトはキャッシュされておらず、データベースからロードする必要があることがわかります。

しかし、リストに対して同じことをどのように処理するのが最善でしょうか。空のリストが有効な値になる可能性があります。リストが存在するかどうかを確認するためにEXISTSを呼び出す必要がありますか(ただし、操作を1つではなく2つ呼び出す)、または誰かがこのシナリオを処理する方法についてより良いアイデアを持っていますか?

/ありがとう

4

3 に答える 3

9

どうしてもそうする必要がある場合は、リストを作成するときに、削除されない最初の要素として「センチネル」をプッシュできます。これをアトミックに行うには、MULTI / EXEC / WATCHを使用できますが、ウォッチは現在プレビューされているRedis 2.2でのみ使用できます(かなり安定している場合でも、githubマスターブランチから取得できます)。

ユースケースでは、RPUSHXとLPUSHXも必要になると思います。これらは、リストがすでに存在する場合にのみ、リストをアトミックにプッシュします。

Redis 2.2が存在するということは、リストに少なくとも1つの要素があることを意味することに注意してください。これは、ゼロ要素に達するリストは、多くの正当な理由で自動的に削除されるためです;)

于 2010-11-05T21:19:33.757 に答える
3

残念ながら、LRANGEやSMEMBERSなどのリスト/セット取得コマンドは、空のリスト/セットと存在しないリスト/セットを区別していないようです。

したがって、2つのケースをどうしても区別する必要がある場合は、最初にEXISTSを実行する必要があると思います。パフォーマンスを向上させるために、コマンドをパイプライン化してみてください。ほとんどのRedisクライアントライブラリはパイプラインをサポートしています。

または、キャッシュ戦略を再検討して、それらを区別する必要がないようにすることもできます。

于 2010-10-29T03:50:00.873 に答える
-1

phpを使用している場合は、戻り値を変数に割り当ててから、それが配列であるかどうかを確認します。(これは、Predisライブラリを使用した場合の動作です)

$res = $redis->get('Key');
if(is_array($res))
    do code here
于 2010-10-28T20:32:12.660 に答える