【问题标题】:Split a Redis big ZSET拆分一个 Redis 大 ZSET
【发布时间】:2016-09-18 10:38:19
【问题描述】:

我们有一个 Redis 密钥。这是一个名为test_keyZSET 结构。 关键是userId,比如123456789。分数是时间戳,比如14741948381474194839。它的长度达到了五千万。我们想拆分它,就像test_key_1test_key_2test_key_3

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

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

【问题讨论】:

  • 为什么要拆分呢?拆分成几个小的zset 会更复杂。
  • 因为它变得越来越大,导致内存变得不平衡。我们使用 redis-cluster 并且我们想要负载均衡。拆分它可以使其分散到不同的redis实例。

标签: java redis jedis


【解决方案1】:

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

调度请求

假设您将数据分成 3 个部分,并存储在 3 个 Redis 实例中。为了保证负载均衡,proxy可以使用MurmurHash函数为每个userId创建一个hash key,并根据hash key将请求分派给一个或多个Redis实例。以zadd为例:zadd test_key userId score

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

合并结果

当代理从一个或多个 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,返回给客户端。

提高性能

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多