performance - 在 Redis 中创建中型到大型列表/集合/zset/哈希的最有效方法是什么?

标签 performance data-structures insert redis jedis

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

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

我见过的所有示例都显示一次只向列表(通过 RPUSHLPUSH )或集合(通过 SADD/ZADD )添加一个项目。

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

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

目前,我正在遍历列表并为每个元素调用适当的添加方法。这具有通过线路发出多个请求并每次都重复 key 的缺点。

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

我认为使用 transactionMULTIEXEC可以帮助把它变成一个单一的请求,但这对重复的键没有帮助。

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 使用的库会更好)。

最佳答案

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

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

关于performance - 在 Redis 中创建中型到大型列表/集合/zset/哈希的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4665759/

相关文章:

java - 复制所有 Activity 而不是[仅复选框和文本](待办事项列表 Android 应用程序)

c++ - 带有前缀和后缀查询的字符串集合的数据结构

javascript - document.getElementbyID 与变量声明和删除性能

javascript - Backbone.js JSON 结构

c++ - 反转数组而不改变零的位置

python - 使用 SQLALchemy 将关系插入到连接 3 个具有多对多关系的表的表中 - python

php - 在 mysql/php 中执行插入...选择...查询时是否可以执行计数(*)?

php - 在插入时为输入数据添加后缀。这可能吗? (MySQL/PHP)

java - 如何将j2ee应用程序分布在多台服务器上?

javascript - 在嵌套循环中设置间隔