私はredisリストを使用しており、新しいアイテムをリストにプッシュしています。問題は、リストにある最新の10アイテムだけが本当に必要なことです。
lpush
を使用してリストにアイテムを追加し、lrange
を使用して最新の10を取得しています。
とにかく、ある数の後にアイテムを落とすことはありますか?最終的には、1,000個のアイテムが含まれる可能性があり、遅延でパフォーマンスの問題が発生する可能性があるリストが作成されます。
ありがとうございました!
lpush
ごとにltrim
を呼び出して、リストを10要素にトリミングします
http://redis.io/commands/ltrim を参照してください
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操作の多くを節約します。
次のコード、
トランザクション。
MULTI
LPUSH list "item1"
LTRIM list 0 9
LRANGE list 0 9
EXEC
ただの選択肢。 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
を呼び出す頻度に応じて調整できます。
最新の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"