REDIS / jedis更新排序集中所有成员的分数

时间:2013-02-21 12:17:48

标签: redis sortedset jedis batch-updates

在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. 然后执行管道。
  4. 还有其他/更好的方法吗?

    更新

    以下是如何在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
    

    将其保存为字符串并使用您的驱动程序运行eval(在本例中为java)。执行不返回任何内容。

    使用Jedis

    // 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");
    

1 个答案:

答案 0 :(得分:2)

客户端和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"