5

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

只有散列有一个方法(HMSET)用一个命令插入多个项目。

我见过的所有示例都显示一次仅将单个项目添加到列表(通过RPUSHLPUSH)或集合(通过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

我认为使用 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 中使用另一个库会更好)。

4

1 回答 1

4

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

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

于 2011-01-12T13:22:11.230 回答