web-dev-qa-db-ja.com

リストの長さをredisで制限する

私はredisリストを使用しており、新しいアイテムをリストにプッシュしています。問題は、リストにある最新の10アイテムだけが本当に必要なことです。

lpushを使用してリストにアイテムを追加し、lrangeを使用して最新の10を取得しています。

とにかく、ある数の後にアイテムを落とすことはありますか?最終的には、1,000個のアイテムが含まれる可能性があり、遅延でパフォーマンスの問題が発生する可能性があるリストが作成されます。

ありがとうございました!

23
dzm

lpushごとにltrimを呼び出して、リストを10要素にトリミングします

http://redis.io/commands/ltrim を参照してください

43

LPUSHの後に [〜#〜] ltrim [〜#〜]intermittentlyを使用できますアプリ内の全体的なレイテンシに追加されるため、LPUSHごとにLTRIMを呼び出す必要はありません(ただし、redisは非常に高速ですが、LPUSH操作の多くを節約できます)

以下は、約5回のLPUSHごとにLTRIMを実現するための疑似コードです。

LPUSH mylist 1
random_int = some random number between 1-5
if random_int == 1:  # trim my list with 1/5 chance
   LTRIM mylist 0 10

あなたのリストは時々10要素以上のいくつかの要素になる可能性がありますが、それは確かに定期的に切り捨てられます。このアプローチは、ほとんどの実用的な目的に適しており、プッシュを高速に保ち、LTRIM操作の多くを節約します。

20
DhruvPathak

次のコード、

  • アイテムをリストにプッシュし、
  • サイズを10に固定します
  • 最新の10個の要素を返します

トランザクション

MULTI
LPUSH list "item1"
LTRIM list 0 9
LRANGE list 0 9
EXEC
9
ovunccetin

ただの選択肢。 LPUSHの-​​ 公式ドキュメント によると、Push操作後のリストの長さを返します。 k(あなたの場合k> 10)のようなしきい値の長さを設定し、返された長さがLTRIMより大きい場合はkを呼び出すことができます。次の擬似コードの例:

len = LPUSH mylist xxx 
if len > k:   
  LTRIM mylist 0 9
LRANGE mylist 0 9

ランダムな方法よりも制御しやすいです。 kを大きくすると、トリガーされるLTRIMは少なくなりますが、メモリコストが高くなります。 kは、追加のコマンドを呼び出す方がコストが高いため、LTRIMを呼び出す頻度に応じて調整できます。

2
wei tu

最新の10アイテムのみを保存するの正確な解決策はありません。

15項目(ここでは数字のみ)のサンプルリストを作成してみましょう。

RPUSH list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

リストの最後からのオフセットを示します。

LTRIM list -10 -1

リストを表示

LRANGE list 0 -1

 1) "6"
 2) "7"
 3) "8"
 4) "9"
 5) "10"
 6) "11"
 7) "12"
 8) "13"
 9) "14"
10) "15"

これで、新しいアイテムを追加してトリムを実行できます。

RPUSH list 16
LTRIM list -10 -1

 1) "7"
 2) "8"
 3) "9"
 4) "10"
 5) "11"
 6) "12"
 7) "13"
 8) "14"
 9) "15"
10) "16"
1
beytarovski