9

REDIS で中サイズのソート済みセットをインクリメントする最良の方法は何ですか? (できれば Java ドライバー JEDIS を使用) Set には約 100 ~ 200K のレコードが含まれます。指定された倍数でスコアを増やしたいです。

1 a
2 b
3 c

後 (1 ずつ増加)

2 a
3 b
4 c

私が思いついた唯一の解決策は次のとおりです。

  1. ネットワークを介してすべてのソートされたセット (A など) のコンテンツを取得します。(REDIS -> アプリケーション)。
  2. パイプラインを作成し、ループ内の ZADD または ZINCRBY を使用して同じ setA でそれらをインクリメントします
  3. 次に、パイプラインを実行します。

それを行う別の/より良い方法はありますか?

アップデート

REDIS で EVAL と Lua を使用して、for ループを実行し、すべての並べ替えられたセット メンバーをインクリメントする方法を次に示します。

local members = redis.call('zrange',KEYS[1],0,-1)
for i, member in ipairs(members) do
    redis.call('zincrby',KEYS[1],inc,member)
end

これを文字列に保存し、ドライバー (この場合は java) を使用して eval を実行します。実行は何も返しません。

ジェディスを使って

// script is the script string
// 1 is the number of keys- keep it this way for this script
// myzset is the name of your sorted set
// 1.5 is the increment, you can use +/- values to inc/dec.
jedis.eval(script, 1, "myzset", "1.5");
4

1 に答える 1

3

クライアントと redis 間の通信には時間がかかる場合があります。それを避けるために、ソートされたセットの「SET タイプ」のコピーを取ることができます。たとえば、ソートされたセット「key1」があるとします。

1 a
2 b
3 c

そして、セット「key2」があります:

a, b, c

インクリメントを簡単に実装できるよりも:

def increase_sorted_set(increment = 1)
  redis.ZINTERSTORE("key1", 2, "key1", "key2", "WEIGHTS", "1", increment)
end

Redis は、(ソートされていない) セットの各メンバーにkey2デフォルトのスコア を与えます1

例えば:

redis 127.0.0.1:6379> ZADD key1 1 a 2 b 3 c
(integer) 3
redis 127.0.0.1:6379> SADD key2 a b c
(integer) 3
redis 127.0.0.1:6379> ZINTERSTORE key1 2 key1 key2 WEIGHTS 1 7
(integer) 3
redis 127.0.0.1:6379> ZRANGE key1 0 -1 WITHSCORES
1) "a"
2) "8"
3) "b"
4) "9"
5) "c"
6) "10"
于 2013-02-21T13:17:26.013 に答える