7

Redis で何らかの種類のキャップ付きデータ構造を実装した人はいますか? 私はニュースフィードのようなものの構築に取り組んでいます。フィードは非常に頻繁に操作されて読み取られることになり、Redis の並べ替えられたセットに保持することは安価であり、私のユース ケースに最適です。唯一の問題は、フィードごとに n 個のアイテムしか必要としないことです。メモリ オーバーフローが心配なので、各フィードが n 個のアイテムを超えないようにしたいと考えています。Lua を使用して、Redis でキャップ付きのソート済みコレクションを作成するのは非常に簡単に思えます。

redis-cli EVAL "$(cat update_feed.lua)" 1 feeds:some_feed "thing_to_add", n

update_feed.lua は次のようになります (テストなし):

redis.call('ZADD', KEYS[1], os.time(), ARGV[1])
local num = redis.call('ZCARD', KEYS[1])
if num > ARGV[2]:
    redis.call('ZREMRANGEBYRANK', KEYS[1], -n, -inf)

これはまったく悪くなく、かなり安価ですが、ソートされたセットを最初に n バケットのみでインスタンス化することで、はるかに安価に実行できる基本的なことのように思えます。私はそれをredisで行う方法を見つけることができないので、私の質問は次のとおりだと思います。私が説明したスクリプトは、redis データ構造のオプションとして実装する必要がある典型的なユースケースのように思えますか?

4

2 に答える 2

19

リストの場合はLTRIMを使用できます。

ドキュメントからの抜粋。

LPUSH mylist someelement
LTRIM mylist 0 99

このコマンドのペアは、リストが 100 要素を超えないようにしながら、新しい要素をリストにプッシュします。これは、Redis を使用してログを保存する場合などに非常に便利です。このように使用する場合、LTRIM は O(1) 操作であることに注意することが重要です。これは、平均的なケースでは、リストの末尾から 1 つの要素だけが削除されるためです。

于 2013-05-20T04:41:45.863 に答える