【发布时间】: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