【问题标题】:What's the most efficient way to create a medium to large list/set/zset/hash in redis?在 redis 中创建中到大型列表/集/zset/hash 的最有效方法是什么?
【发布时间】:2011-06-07 15:16:19
【问题描述】:

使用redis,有许多命令可以检索整个数据结构(LRANGE 用于列表,SMEMBERS 用于集合,ZRANGE 用于排序集合,HGETALL 用于哈希)。

只有哈希有一个方法 (HMSET) 可以用一个命令插入多个项目。

我见过的所有示例都显示了一次仅将一个项目添加到列表(通过RPUSH 或LPUSH)或一组(通过SADD/ZADD)。

我要解决的更具体的问题是创建包含数据库 id 的列表和排序集,这些列表对每个用户都是唯一的,并且包含几百到几千个 id。

它们通常是从数据库查询中收集的,在内存中稍作调整,然后存储在 redis 中,用于分页(列表)或执行基于集合的操作以检索子集(集合和排序集合)。

目前,我正在遍历列表并为每个元素调用适当的 add 方法。这样做的缺点是通过网络发出多个请求并且每次都重复密钥。

redis> RPUSH employee:ids 1000
(integer) 1
redis> RPUSH employee:ids 1001
(integer) 2
redis> RPUSH employee:ids 1002
(integer) 3
redis> RPUSH employee:ids 1003
(integer) 4
redis> del employee:ids
(integer) 1

我在想将transaction 与MULTI 和EXEC 一起使用可能有助于将其转换为单个请求,但这对重复键没有帮助。

redis> MULTI
OK
redis> RPUSH employee:ids 1000
QUEUED
redis> RPUSH employee:ids 1001
QUEUED
redis> RPUSH employee:ids 1002
QUEUED
redis> RPUSH employee:ids 1003
QUEUED
redis> RPUSH employee:ids 1004
QUEUED
redis> EXEC
1. (integer) 1
2. (integer) 2
3. (integer) 3
4. (integer) 4
5. (integer) 5

我是否缺少某些东西可以让我在单个命令中将元素添加到列表/集合中,或者无需每次都重复键?

如果这很重要,我也会使用 jedis 客户端库(或者如果我可以从 JVM 中使用另一个库会更好)。

【问题讨论】:

  • 附带说明,您可能会考虑使用排序集而不是列表进行分页 - 列表访问时间随偏移量线性增加,而排序集访问时间始终与集合大小的日志成正比.列表最适合用于堆栈和队列,您通常只能在任一端访问。

标签: performance data-structures insert redis jedis


【解决方案1】:

在这里设置交易无济于事。事务的目的是确保命令同时执行,这样服务器上就永远不会有一半的列表。他们仍然一次收到一份。

多个命令真的会导致性能问题吗? 1000 个项目实际上并没有那么多,只要您没有为每个项目打开新连接之类的操作,就不应该有任何延迟问题。

【讨论】:

  • 我承认我有点预先担心性能,但我还没有对当前应用程序进行任何重要的负载测试。我部分只是想知道我是否做得“正确”,或者当我手头有一个想要进入redis的列表/集合时我是否缺少某些东西。如果迭代并一次添加一个是它的完成方式,我很酷。我可能会派生/提交补丁到绝地武士,以添加将采用现有列表/集并为我旋转列表的方法。
  • 不,你没有错过任何东西。批量添加是我可以看到将来添加到 redis 的东西,但这并不是获得优先级的足够显着的改进 - 本地套接字速度下的 19 个字节并没有太大区别。为您的客户增加支持是个好主意。您还可以选择在发送下一个项目之前不等待响应 - 它使错误处理更加困难,但如果您有延迟问题,应该可以为您提供与单个命令相同的性能。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多