在Redis中使用唯一元素实现队列

时间:2019-11-15 07:39:47

标签: redis redis-cache elastic-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_cache.rpop('QUEUE')
    redis_cache.zrem('UNIQUE', key)
    return key
`

通过高负载/密钥请求,Redis缓存服务器使用了更多的CPU。以及上述方法占用更多内存(List和Sortedset中都使用了相同的键) 还有其他方法可以实现具有密钥唯一性的Redis队列吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

首先,应使用 [ '$project' => [ '_id' => 1.0, 'Name' => 1.0, 'AllotmentsDetails' => 1.0, 'NonExpiredAllotmentsOfRoomWithCheckoutZero' => 1.0, 'NonExpiredAllotmentsOfRoomWithCheckoutOne' => 1.0, 'NonExpiredAllotmentsOfRoom' => 1.0, 'RecentAllotmentsDetails' => [ '$cond'=> [ 'if'=> [ '$not' => ['$NonExpiredAllotmentsOfRoom' => [ '$size' => 0 ]] ], 'then' => ['$arrayElemAt' => ['$NonExpiredAllotmentsOfRoom', -1 ]], 'else' => [] ] ] ]] 而不是Set来检查密钥是否已存在。 Sorted SetSorted Set使用更多的内存。

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

  

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

随机订单队列

如果您不关心队列的顺序,即不需要FIFO,则可以使用不带Set的单个Set来实现具有随机顺序的队列。该解决方案将只需要向Redis发送一条命令,就可以节省更多的内存,并且速度更快。

List

答案 2 :(得分:0)

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