当前位置: 首页 > 知识库问答 >
问题:

从Redis数据结构中原子地弹出多个值?

谷翰飞
2023-03-14

Redis数据结构允许弹出(获取+删除)多个元素的原子操作吗?

有众所周知的SPOP或RPOP,但它们总是返回单个值。因此,当我需要set/list中的前N个值时,我需要调用命令N次,这是昂贵的。假设集合/列表包含数百万项。有没有像spopm“setname”1000那样的东西,它会从set中返回并删除1000个随机项,或者像rpopm“listname”1000那样的东西,它会从list中返回1000个最右边的项?

我知道有像SRANDMEMBER和LRANGE这样的命令,但它们不会从数据结构中移除项。可以单独删除。但是,如果有更多的客户端从相同的数据结构读取,那么有些项可以被读取不止一次,有些项可以在不读取的情况下被删除!因此,原子性就是我的问题。

另外,如果这样操作的时间复杂度更昂贵,我也没问题。我怀疑它会比向Redis服务器发出N个(比方说1000,N个来自前面的例子)单独的请求更昂贵。

我还了解单独事务支持。但是,来自Redis docs的这句话不鼓励我使用它来修改集合的并行进程(从它破坏性地读取):
当使用WATCH时,只有当被监视的键未被修改时,EXEC才会执行命令,从而允许检查和设置机制。

共有1个答案

戴嘉珍
2023-03-14

从Redis3.2开始,命令spop有一个[count]参数,用于从一个集合中检索多个元素。

请参阅http://redis.io/commands/spop#count-argument-extension

 类似资料:
  • 问题内容: 可以说我有一个散列,例如 存储这种数据结构的“通常”方式是什么(或者您不会吗?) 您是否可以直接获得价值(例如,获取哈利:年龄? 一旦存储,您是否可以直接更改子键的值(例如,sally:weight = 100) 问题答案: 存储这种数据结构的“通常”方式是什么(或者您不会吗?) 例如,哈利(Harry)和莎莉(Sally)将分别存储在单独的散列中,其中字段代表其属性,例如年龄和体重。

  • 问题内容: Redis中排序后的集合和列表之间的空间差异是什么?我的猜测是排序集是某种平衡的二叉树,而列表是链接列表。这意味着,在我为它们分别编码的三个值(键,分数,值)之上,尽管我将为链表的分数和值一起拼凑,但开销是链表需要跟踪一个其他节点,并且二叉树需要跟踪两个,因此使用排序集的空间开销为O(N)。 如果我的值和得分都为long,而指向其他节点的指针也为long,则在64位计算机上,单个节点的

  • 我们正在开发一个应用程序,在这个应用程序中,我们从不同的源和不同的格式接收json格式的数据,用户也可以将这些源添加到自己的那里,所以我们不知道json格式会有什么属性 我们的应用程序将该数据表示为网格格式,网格提供了对该数据的过滤、排序、分页、分组等标准操作。 我们决定使用弹性搜索来存储如此大的、非结构化的数据。在后端,我们使用。NET(C#)。 开始使用大容量API对数据进行索引。下面是示例j

  • 本文向大家介绍redis中使用redis-dump导出、导入、还原数据实例,包括了redis中使用redis-dump导出、导入、还原数据实例的使用技巧和注意事项,需要的朋友参考一下 redis的备份和还原,借助了第三方的工具,redis-dump 1、安装redis-dump 2、redis-dump导出数据 3、redis-load还原数据

  • 问题内容: 我有一个Redis实例,其中有两个数据库。现在,我想设置第二个实例并复制第一个实例,但是第二个实例应该仅具有一个数据库,并且仅复制第一个实例中的db 0。当我尝试执行此操作(为第二个实例设置)时,我在Redis日志文件中收到以下错误消息: 我尝试使用redis-dump,但是尝试将生成的转储导入新实例时出现错误。(我认为与2 dbs和1 db无关,而是redis-dump中的一个错误,

  • 问题内容: 我不需要丢失Redis上的任何数据,并且它具有较高的写入请求,因此我不能使用AOF持久性。RDB可以帮到您,但也许有可能丢失上次备份中的某些数据。 现在,我将复制视为备份,因此当主服务器崩溃,重新启动或发生其他任何事情时,我已经同步了从属服务器中的数据并可以再次还原它。 现在有什么办法可以将master设置为slave,并在崩溃时自动将slave设置为master,然后将它们同步? 问