16

JavaアプリでRedisTemplate(Springから)を使用しています。値に対応する要素のリストからポップを実行する必要がありますが、削除する必要はありません。助言がありますか?

4

3 に答える 3

22

rangeコマンドを使用すると、アイテムをポップするのではなく、簡単に覗くことができます。

Springでは、RedisTemplateインスタンスから、opsForList()メソッドを使用してListOperationsインスタンスを取得し、次のようにします。

  • listOp.range(key、0、0)は、最初の(左の)アイテムをポップせずに返します

  • listOp.range(key、-1、-1)は、最後の(右)アイテムをポップせずに返します

次のドキュメントを参照してください。

http://static.springsource.org/spring-data/data-keyvalue/docs/1.0.x/api/org/springframework/data/keyvalue/redis/core/RedisTemplate.html

http://static.springsource.org/spring-data/data-keyvalue/docs/1.0.x/api/org/springframework/data/keyvalue/redis/core/ListOperations.html

于 2012-06-04T14:57:17.327 に答える
2

アイテムを削除せずにポップし、有効期限内に休止状態に保つ方法はありますか?有効期限が切れると(削除されない場合)、このアイテムはウェイクアップして再びポップする可能性があります。

http://redis.io/commands/rpoplpush

パターン:信頼性の高いキューRedisは、バックグラウンドジョブやその他の種類のメッセージングタスクの処理を実装するためのメッセージングサーバーとしてよく使用されます。単純な形式のキューは、多くの場合、プロデューサー側のリストに値をプッシュし、RPOP(ポーリングを使用)を使用してコンシューマー側でこの値を待機するか、クライアントがブロッキング操作によってより適切に処理される場合はBRPOPを使用して取得されます。ただし、このコンテキストでは、たとえばネットワークの問題がある場合や、メッセージを受信した直後にコンシューマーがクラッシュしたがまだ処理中である場合など、メッセージが失われる可能性があるため、取得したキューは信頼できません。RPOPLPUSH(またはブロッキングバリアントの場合はBRPOPLPUSH)は、この問題を回避する方法を提供します。コンシューマーはメッセージをフェッチすると同時に、メッセージを処理リストにプッシュします。メッセージが処理されると、処理リストからメッセージを削除するためにLREMコマンドを使用します。追加のクライアントは、処理リストに長時間残っているアイテムがないか監視し、必要に応じて、タイムアウトしたアイテムを再びキューにプッシュします。

于 2013-03-08T06:30:14.587 に答える
1

RedisTemplateを使用してこれを行う方法はわかりませんが、リストから値を取得するには、redisコマンドを使用できます。

LRANGE <LIST> 0 0

最初の値を取得します。ここで、<LIST>はリストの名前です。

RedisTemplateにこれに似たものはありますか?

于 2012-06-04T14:32:40.140 に答える