是否有一个 Redis 数据结构,允许弹出(获取+删除)其中包含的多个元素的原子操作?
有众所周知的 SPOP 或 RPOP,但它们总是返回单个值。因此,当我需要 set/list 中的前 N 个值时,我需要调用该命令 N 次,这是昂贵的。假设集合/列表包含数百万个项目。有没有类似的东西SPOPM "setName" 1000
,这将返回并从集合中删除 1000 个随机项目或RPOPM "listName" 1000
,这会返回列表中最右边的 1000 个项目?
我知道有像 SRANDMEMBER 和 LRANGE 这样的命令,但它们不会从数据结构中删除项目。它们可以单独删除。但是,如果有更多客户端读取同一数据结构,则某些项目可以多次读取,而有些则可以在不读取的情况下删除!因此,原子性就是我的问题所在。
另外,如果此类操作的时间复杂度更昂贵,我也没关系。我怀疑这会比向 Redis 服务器发出 N 个(比方说 1000 个,前一个示例中的 N 个)单独请求更昂贵。
我还了解单独的交易支持。然而,Redis 文档中的这句话不鼓励我将它用于修改集合的并行进程(破坏性地从中读取):
使用 WATCH 时,只有在监视的键未被修改时,EXEC 才会执行命令,从而允许检查和设置机制。 http://redis.io/commands/exec
Use LRANGE
with LTRIM
in a pipeline http://redis.io/topics/pipelining。该管道将作为一个原子事务运行。您的上述担忧WATCH
, EXEC
此处不适用,因为您正在运行LRANGE
and LTRIM
作为一项交易,它们之间无法进行来自任何其他客户的任何其他交易。试试看。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)