拆分Redis大型ZSET

时间:2016-09-18 10:38:19

标签: java redis jedis

我们有一把Redis钥匙。它是名为test_key ZSET 结构。 关键是userId,例如123456789。得分是时间戳,如14741948381474194839。它的长度达到了五千万。我们希望将其拆分,就像test_key_1test_key_2test_key_3一样。

如何分割它可以使CRUD更容易?

我们是java开发人员。最常用的Redis商品是zaddzremzrangezrangeByscorezrangeByscoreWithScoreszcard等等。

1 个答案:

答案 0 :(得分:0)

如果必须将数据拆分为多个Redis实例,则需要代理将请求分派给一个或多个Redis实例,并合并这些实例的结果。代理可以实现为库或服务(例如RPC服务器)。

  

发货请求

假设您将数据拆分为3个部分,并存储在3个Redis实例中。为了确保负载平衡,代理可以使用MurmurHash函数为每个userId创建一个哈希密钥,并根据哈希密钥将请求分派给一个或多个Redis实例。以zadd为例:zadd test_key userId score

  1. 计算Redis实例ID:id = MurmurHash(userId) mod 3
  2. zadd命令发送到相应的Redis:zadd test_key_id userId score
  3.   

    合并结果

    当代理从一个或多个Redis实例获取结果时,它会合并结果并返回到客户端。以zcard为例:zcard test_key

    1. 从所有实例中获取结果:zcard1 = zcard test_key1zcard2 = zcard test key2zcard3 = zcard test_key3
    2. 合并结果:zcard_res = zcard1 + zcard2 + zcard3
    3. 将结果(即zcard_res)返回给客户。
    4.   

      提高绩效

      为了提高性能,当代理将请求分派给多个实例时,它应该并行调度请求。