我需要在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队列吗?
答案 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 Set
比Sorted Set
使用更多的内存。
第二,您的代码不是原子的。如果要使其原子化,则需要使用Lua脚本或事务。
还有其他方法可以实现具有密钥唯一性的Redis队列吗?
如果您不关心队列的顺序,即不需要FIFO,则可以使用不带Set
的单个Set
来实现具有随机顺序的队列。该解决方案将只需要向Redis发送一条命令,就可以节省更多的内存,并且速度更快。
List
答案 2 :(得分:0)
根据此answer,您必须选择执行多项操作-时间成本(删除时再删除,如果在删除过程中发现,则再次添加)或维护单独的集合-内存成本(您的方法)。 LREM是O(N),其中N是列表的长度,但是一个元素的SREM复杂度是O(1),因为N是要删除的成员数。 SISMEMBER始终为O(1)。