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

在Redis中实现具有唯一元素的队列,redis,amazon-elasticache,redis-cache,Redis,Amazon Elasticache,Redis Cache,我需要在Redis中使用唯一元素实现队列。 目前,我正在使用Redis列表实现队列(LPUSH、RPOP),并使用Redis Sortedset/set实现唯一性 ` def push(key): if redis_cache.zadd('UNIQUE', key, 1): redis_cache.lpush('QUEUE', key) else: print "Key Exist" ` ` def pop(): key = redis_

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

`  
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。而且上述方法占用更多内存(列表和Sortedset中对相同的键进行排序) 是否有其他方法实现具有密钥唯一性的Redis队列

根据这一点,您必须在执行多个操作-及时消耗(删除时,如果在删除过程中发现,请删除,然后再次添加)或在内存中维护一个单独的集合-消耗(您的方法)之间进行选择。
LREM是O(N),其中N是列表的长度,但是一个元素的SREM复杂性是O(1),因为N是要删除的成员数。而且SISMEMBER始终是O(1)。

首先,您应该使用
集合
,而不是
排序集合
,来检查密钥是否已经存在<代码>排序集比
使用更多内存

其次,你的代码不是原子的。如果要使其原子化,需要使用Lua脚本或事务

是否有其他方法实现具有密钥唯一性的Redis队列

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

// in queue
SADD UNIQUE key

// out queue, pop a random member.
SPOP UNIQUE

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

是的,pop操作中存在竞争条件。好主意!虽然顺序不是很准确(在同一秒或毫秒内添加的项目是按键排序的),而且客户端可能会作弊(通过指定以前的时间戳),但在大多数情况下,这应该是一个好的解决方案。这是一个好主意。我想我的问题会用这个解决方案解决的。谢谢。使用时间戳有两个问题,因为
分数
:1)时间可能会倒退(例如由于NTP漂移)。2) 如果
ZADD
s彼此接近,您可能会得到相同的时间戳-排序将是字典式的,这可能不是您想要的