【发布时间】:2014-01-04 11:37:40
【问题描述】:
是否有一个 Redis 数据结构,它允许对它包含的多个元素进行弹出(get+remove)的原子操作?
有众所周知的 SPOP 或 RPOP,但它们总是返回单个值。因此,当我需要来自 set/list 的前 N 个值时,我需要调用命令 N 次,这很昂贵。假设集合/列表包含数百万个项目。有没有像SPOPM "setName" 1000 这样的东西,它会从集合中返回并删除 1000 个随机项或RPOPM "listName" 1000,它会从列表中返回 1000 个最右边的项?
我知道有像 SRANDMEMBER 和 LRANGE 这样的命令,但它们不会从数据结构中删除项目。它们可以单独删除。但是,如果有更多的客户端从同一个数据结构中读取,有些项目可以被多次读取,有些可以不读取就删除!因此,原子性是我的问题所在。
另外,如果这种操作的时间复杂度更高,我很好。我怀疑它会比向 Redis 服务器发出 N 个(假设是 1000,前一个示例中的 N 个)单独请求更昂贵。
我也知道单独的事务支持。但是,Redis 文档中的这句话不鼓励我将它用于修改集合的并行进程(破坏性地从中读取):
When using WATCH, EXEC will execute commands only if the watched keys were not modified, allowing for a check-and-set mechanism.
【问题讨论】:
标签: data-structures redis time-complexity atomic