问题是指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
用于搜索的用例:
在单一实例和分片配置中,一切正常,但我会遇到以下问题:
也提前感谢您的回复。
答案 0 :(得分: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;
}
AFAIK,Jedis在使用Shards时不支持交易,即使您强制相关的键位于同一个分片上(参见Jedis Advanced Usage)。
此链接提示可能适用于几种情况的解决方法:
混合方法
如果想要轻松负载分配ShardedJedis,但仍需要 Transactions / pipelining / pubsub等,你也可以混合正常和 分片方法:将主人定义为普通的Jedis,其他人定义为 分片杰迪斯。然后使所有分片成为奴隶主。在你的 应用程序,将您的写请求指向主服务器,读取 请求ShardedJedis。你的写作不再扩展,但你 获得良好的阅读分布,你有 仅使用主服务器的事务/流水线/ pubsub。数据集应该 适合大师的RAM。请记住,您可以提高性能 掌握了很多,如果你让奴隶为主人做坚持!