Redis SELECT 性能

5
我正在使用redis的多个数据库(通过SELECT命令进行切换)。
我需要将不同类型的信息存储到redis中,并且需要以某种方式对其进行区分。我不想通过前缀来区分信息类型,所以我创建了更多的数据库。
我想问一下这是否是正确的决定,是否会影响性能?
另外,SELECT命令会带来多少额外开销?如果我需要从两个数据库中遍历一些相关数据,哪种方法更好(见伪代码)?
for data in array {
  redis_select(0)
  k = redis_get(...)
  redis_select(1)
  k2 = redis_get(k)
}

或者

redis_select(0)
k = []
for data in array {
  k[x] = redis_get(...)
}

redis_select(1)
k2 = []
for data in array {
  k2[x] = redis_get(k[x])
}
1个回答

8
您可以使用Redis数据库概念来分离数据。当前版本完全支持它,并且在未来的版本中也会得到支持。
现在,这不是隔离数据的推荐解决方案。最好改为运行多个Redis实例。一个实例的开销非常低(小于1 MB),因此您可以在任何盒子上启动多个实例。它更具扩展性(工作负载将分布在多个CPU核心上而不仅仅是一个)。它更灵活(您可能想针对每个数据集使用不同的配置参数或不同的转储文件)。您的客户端只需要打开一个连接来访问各个数据集。
现在,如果您仍然想使用Redis数据库,并且关心性能,那么您需要评估它们所代表的额外往返次数的数量。对于像Redis这样的内存数据库,所有基本操作的成本几乎相同,因为它由通信和协议管理主导,而不是由执行本身主导。因此,当键/值很小时,GET、SET、SELECT命令倾向于具有相同的成本。每次执行SELECT时,就像执行了额外的GET或SET命令一样。
采用您的示例,第一个提议将为数组中的每个项目生成4个命令。第二个提议将为每个项生成仅2个命令,因此更有效。如果项目数量很大,则第二个提议中SELECT的成本可以忽略不计,而在第一个提议中则不能。
如果您计划迭代数组以运行Redis命令,请考虑使用可变参数命令(例如MGET/MSET)或流水线传输(如果客户端支持),以减少总往返次数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接