首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Redis中实现具有唯一元素的队列

在Redis中实现具有唯一元素的队列
EN

Stack Overflow用户
提问于 2019-11-15 07:39:47
回答 3查看 1.3K关注 0票数 3

我需要用唯一的元素在Redis中实现队列。目前正在使用Redis列表来实现队列(LPUSH,RPOP)和Redis /set来实现唯一性。

代码语言:javascript
复制
`  
def push(key):
    if redis_cache.zadd('UNIQUE', key, 1):
        redis_cache.lpush('QUEUE', key)
    else:
       print "Key Exist"
`
`
def pop():
    key = redis_cache.rpop('QUEUE')
    redis_cache.zrem('UNIQUE', key)
    return key
`

在高负载/密钥请求的情况下,Redis缓存服务器使用更多的CPU。而且上面的方法占用更多的内存(相同的密钥在List和Sortedset中都被审查),还有其他方法来实现带键唯一性的队列吗?

EN

回答 3

Stack Overflow用户

发布于 2019-11-15 16:43:56

实际上,我会考虑使用单个排序集,将分数设置为时间戳,并使用ZADD的"NX“标志。这将提供排序和唯一性。

票数 4
EN

Stack Overflow用户

发布于 2019-11-15 08:29:29

首先,您应该使用Set,而不是Sorted Set来检查密钥是否已经存在。Sorted SetSet使用更多的内存。

第二,代码不是原子的。如果要使其具有原子性,则需要使用Lua脚本或事务。

还有其他方法来实现具有密钥唯一性的Redis队列吗?

随机序队列

如果您不关心队列的顺序,即不需要FIFO,则可以使用没有List的单个List来实现具有随机输出顺序的队列。这个解决方案将节省更多的内存,而且速度更快,因为它只需要向Redis发送一个命令。

代码语言:javascript
复制
// in queue
SADD UNIQUE key

// out queue, pop a random member.
SPOP UNIQUE
票数 1
EN

Stack Overflow用户

发布于 2019-11-15 07:58:24

根据这个answer,您必须在进行多个操作--时间上的成本(删除,如果在删除过程中发现再次添加)和在内存中保持单独的设置成本(您的方法)之间进行选择。LREM是O(N),其中N是列表的长度,但是一个元素的SREM复杂度是O(1),因为N是要删除的成员数。SISMEMBER总是O(1)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58872337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档