Redis SELECT性能

Jan*_*ťák 5 redis

我正在使用带有多个数据库的redis(我通过SELECT命令切换).

我将不同类型的信息存储到redis中,我需要以某种方式将其分开.我不喜欢使用密钥作为前缀来区分信息类型,因此我创建了更多的数据库.

我想问一下这是一个正确的决定,关注绩效吗?

SELECT还会产生多少开销?如果我需要从两个数据库中遍历一些相关数据,哪种方法更好(参见伪代码)?

for data in array {
  redis_select(0)
  k = redis_get(...)
  redis_select(1)
  k2 = redis_get(k)
}
Run Code Online (Sandbox Code Playgroud)

要么

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])
}
Run Code Online (Sandbox Code Playgroud)

Did*_*zia 8

您可以使用Redis数据库概念来分隔数据.这在当前版本中完全支持,并且在将来仍然会得到支持.

现在,这不是隔离数据的推荐解决方案.最好运行几个Redis实例.实例的开销非常低(小于1 MB),因此您可以在任何盒子上启动其中的几个.它更具可扩展性(工作负载将分布在多个CPU内核而不是一个).它更灵活(您可能希望为每个数据集或不同的转储文件使用不同的配置参数).您的客户端只需要为每个实例打开一个连接以访问各种数据集.

现在,如果您仍想使用Redis数据库并且关注性能,则需要评估它们所代表的额外往返次数.对于像Redis这样的内存数据库,所有基本操作的成本几乎相同,因为它主要是通信和协议管理,而不是执行本身.因此,当键/值很小时,GET,SET,SELECT命令往往具有相同的成本.每次执行SELECT时,就像执行额外的GET或SET命令一样.

举个例子,第一个提案将为每个数组项生成4个命令.第二个提案每个项目只生成2个命令,因此效率更高.如果项目数量很大,则第二个提案中SELECT的成本可以忽略不计,而不是第一个提案.

如果您计划迭代数组以运行Redis命令,请考虑使用variadic参数命令(例如MGET/MSET)或流水线操作(如果您的客户端支持它),以减少往返次数.