我需要用唯一的元素在Redis中实现队列。目前正在使用Redis列表来实现队列(LPUSH,RPOP)和Redis /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中都被审查),还有其他方法来实现带键唯一性的队列吗?
发布于 2019-11-15 16:43:56
实际上,我会考虑使用单个排序集,将分数设置为时间戳,并使用ZADD的"NX“标志。这将提供排序和唯一性。
发布于 2019-11-15 08:29:29
首先,您应该使用Set,而不是Sorted Set来检查密钥是否已经存在。Sorted Set比Set使用更多的内存。
第二,代码不是原子的。如果要使其具有原子性,则需要使用Lua脚本或事务。
还有其他方法来实现具有密钥唯一性的Redis队列吗?
随机序队列
如果您不关心队列的顺序,即不需要FIFO,则可以使用没有List的单个List来实现具有随机输出顺序的队列。这个解决方案将节省更多的内存,而且速度更快,因为它只需要向Redis发送一个命令。
// in queue
SADD UNIQUE key
// out queue, pop a random member.
SPOP UNIQUE发布于 2019-11-15 07:58:24
根据这个answer,您必须在进行多个操作--时间上的成本(删除,如果在删除过程中发现再次添加)和在内存中保持单独的设置成本(您的方法)之间进行选择。LREM是O(N),其中N是列表的长度,但是一个元素的SREM复杂度是O(1),因为N是要删除的成员数。SISMEMBER总是O(1)。
https://stackoverflow.com/questions/58872337
复制相似问题