Redis 从列表中弹出多个元素
Redis poping multiple elements from a list
我正在寻找 LPOP 和 LPOPRPUSH 作为弹出值的原子操作的有效选项。
但是我有一份工作,每 2 秒从该列表中弹出 1000 个值——这是对 Redis 的 1000 个请求。
我会使用 SPOP,它可以在一个请求中返回 return X 个值。但那些是随机的,而不是最左的。
我确实需要从列表的左侧弹出它们。
在没有锁定和原子的情况下,我有哪些最快的选择?我有多个访问此列表的服务器,但我无法检索重复值(这就是 LRANGE 对我不起作用的原因)
编辑
我越想越觉得我需要妥协并使用 SPOP。
场景是使用Redis批量插入到数据库中。而不是每秒向 MySQL 插入数千个 - 我正在推送到 Redis,每 2 秒获取值并一次性插入到 MySQL.
我想我可以使用 SPOP,如果我将时间戳添加到 Redis 中的实际值,并且为了避免值可能永远卡在集合中的可能性,我将 运行 循环 SPOP x 1000
直到为空。
有选项:
- 使用 Lua 脚本在单个
EVAL
命令中弹出 N 个元素:
EVAL 'local result = {}; for i = 1, ARGV[1] do result[i] = redis.call("lpop", KEYS[1]) end; return result' 1 key N
- 使用Redis pipeline发送N条
LPOP
条命令减少RTT。
我正在寻找 LPOP 和 LPOPRPUSH 作为弹出值的原子操作的有效选项。 但是我有一份工作,每 2 秒从该列表中弹出 1000 个值——这是对 Redis 的 1000 个请求。 我会使用 SPOP,它可以在一个请求中返回 return X 个值。但那些是随机的,而不是最左的。 我确实需要从列表的左侧弹出它们。
在没有锁定和原子的情况下,我有哪些最快的选择?我有多个访问此列表的服务器,但我无法检索重复值(这就是 LRANGE 对我不起作用的原因)
编辑 我越想越觉得我需要妥协并使用 SPOP。
场景是使用Redis批量插入到数据库中。而不是每秒向 MySQL 插入数千个 - 我正在推送到 Redis,每 2 秒获取值并一次性插入到 MySQL.
我想我可以使用 SPOP,如果我将时间戳添加到 Redis 中的实际值,并且为了避免值可能永远卡在集合中的可能性,我将 运行 循环 SPOP x 1000
直到为空。
有选项:
- 使用 Lua 脚本在单个
EVAL
命令中弹出 N 个元素:
EVAL 'local result = {}; for i = 1, ARGV[1] do result[i] = redis.call("lpop", KEYS[1]) end; return result' 1 key N
- 使用Redis pipeline发送N条
LPOP
条命令减少RTT。