【发布时间】:2020-11-13 21:35:49
【问题描述】:
我正在寻找 LPOP 和 LPOPRPUSH 作为弹出值的原子操作的有效选项。 但是我有一项工作,每 2 秒从该列表中弹出 1000 个值 - 这是对 Redis 的 1000 个请求。 我会使用 SPOP,它可以在一个请求中返回 X 值。但那些是随机的,而不是最左边的。 我确实需要从列表的左侧弹出它们。
在没有锁定和原子的情况下,我有哪些最快的选择?我有多个服务器可以访问此列表,但我无法检索重复值(这就是 LRANGE 对我不起作用的原因)
编辑 我越想越觉得需要妥协和使用 SPOP。
场景是使用 Redis 批量插入到数据库中。而不是每秒向 MySQL 插入数千个 - 我正在推送到 Redis,每 2 秒获取值并一次性插入 MySQL。
如果我将时间戳添加到 Redis 中的实际值,我想我可以使用 SPOP,并且为了避免值可能永远卡在集合中的可能性,我将运行 SPOP x 1000 循环直到 null。
【问题讨论】:
-
您是否考虑过使用事务?完整的事务是原子的和一个请求,但是是顺序执行的多个命令(这可能是您试图避免的,而不是寻找单个命令)
-
你在
multi/exec或lua内部尝试lrange和ltrim? -
我读过这个选项,但没有尝试过,因为我想要一个没有可能失败的简单解决方案(redis 事务中没有回滚)。
-
lrange将充当read和ltrim将充当write/update并且将按照该顺序进行,因此即使您在读取时失败,它也不会影响写入所以列表不会处于脏状态。 -
理论上,两个会话可以读取相同的对象吗?
标签: redis redis-cluster