在Sharded Redis中搜索和交易

时间:2013-07-12 14:13:48

标签: redis sharding jedis

问题是指redis的分片配置。我在Java中实现了一个小型测试应用程序,它以user:userID的形式在Jedis上创建了100.000个用户哈希值。每个哈希都包含以下元素:名称,电话,部门,用户ID。我还使用关键电话创建了简单的键值对:电话号码,其中包含其电话号码为ID的用户ID,并为每个部门设置了具有为该特定部门工作的用户ID。后两种类型我只用于搜索。这些结构和搜索类似于Searching in values of a redis db

简而言之,数据结构:

user:userID->{name, department, phone, userID}
department:department->([userID1, userID2,....])
phone:phone->userID

用于搜索的用例:

  1. 根据密钥即userID
  2. 访问用户哈希
  3. 搜索具有电话号码的用户
  4. 搜索部门的所有用户
  5. 单一实例分片配置中,一切正常,但我会遇到以下问题:

    • 在单实例配置中,可以查找电话 带有宽卡的号码,例如使用 KEY 方法,但事实并非如此 在分片配置中可用。怎么可能呢? 寻找第一部分已知的钥匙?
    • 用户ID是从分数增加的zset生成的 用户身份。这可以在单个实例的事务中执行 配置,但分片似乎不支持事务 jedis上的配置,即使参与的密钥在 相同的实例。 如果可以解决这个问题怎么可能? 多个客户端线程也可以创建用户吗?

    也提前感谢您的回复。

1 个答案:

答案 0 :(得分:1)

对于问题的第1部分:

这里没有魔力,如果你想搜索所有的分片,你必须遍历所有分片。 Jedis没有这种方法,但您可以扩展 ShardedJedis 来添加它(未经测试):

    public Set<String> keys(String pattern) {
    HashSet<String> found = new HashSet<String>();

    for (Jedis jedis : getAllShards()) {
        found.addAll(jedis.keys(pattern));
    }

    return found;
    }

对于问题的第2部分:

AFAIK,Jedis在使用Shards时不支持交易,即使您强制相关的键位于同一个分片上(参见Jedis Advanced Usage)。

此链接提示可能适用于几种情况的解决方法:

  

混合方法

     

如果想要轻松负载分配ShardedJedis,但仍需要   Transactions / pipelining / pubsub等,你也可以混合正常和   分片方法:将主人定义为普通的Jedis,其他人定义为   分片杰迪斯。然后使所有分片成为奴隶主。在你的   应用程序,将您的写请求指向主服务器,读取   请求ShardedJedis。你的写作不再扩展,但你   获得良好的阅读分布,你有   仅使用主服务器的事务/流水线/ pubsub。数据集应该   适合大师的RAM。请记住,您可以提高性能   掌握了很多,如果你让奴隶为主人做坚持!