0

我是新手Redis,发现有各种数据结构支持Redis并根据要求我们可以选择其中任何一种。我的要求是将字符串一一插入到列表(key-list)中,并希望一次检索(并删除)所有内容。而且我也想经常这样做,所以试图找到一种最佳方式。哪种数据结构/方式会更好?先感谢您

PS:我不想在检索时删除密钥,我只需要检索并清空列表。

4

3 回答 3

1

您可能希望使用一个简单的列表来实现此目的。您可能想要使用一组有一个原因,但我稍后会谈到。

您将使用LPUSH将项目添加到列表中。请注意,您无需存在该列表即可首次执行此操作。这是一个O(1)(恒定时间)操作,因此您可以获得尽可能快的速度。要检索您将使用的所有项目LRANGE 0 -1。这最终将O(N)SMEMBERS(类似的设置操作)相同。最后,无论您使用集合还是列表,您都将DEL再次使用 which将具有相同的性能。O(N)

正如我所提到的,在一种情况下,您会在列表上使用集合。那是您想要防止重复但不关心顺序的时候。在这种情况下,您将添加成员SADD并使用 检索所有成员SMEMBERS。使用集合与使用列表具有完全相同的性能,只是您是为了唯一性而交易订单。如果您想防止重复但又关心顺序,您将需要使用排序集。操作会稍微复杂一些,因为您需要跟踪分数,但它仍然相当简单。使用排序集也会对性能造成非常小的影响。这不用担心,因为 Redis非常快。

于 2016-11-28T08:16:22.347 回答
1

如果您有一些可以用作分隔符的字符,您也可以使用APPEND 。它是 O(1)。然后您可以获取整个字符串并使用GETSET重置它。缺点是如果你需要的话,你将不得不在你自己的代码中再次将它变成一个列表。

于 2016-11-29T03:48:59.240 回答
1

听起来你应该使用ListLPUSH使用或添加到列表中,然后使用和键RPUSH检索所有内容。LRANGEDEL

PS Redis中的一个key,比如一个存储List的key,不能为空。删除列表的所有成员后,密钥本身不再存在,因此您可以删除它而不是尝试清空它。

更新了对 OP 评论的回答:并非如此,没有免费的午餐,无论您必须采用何种方法进行 O(N) 读取和删除。在某些情况下,最好只执行一次迭代,例如减少网络通信,但这不是其中之一。

无论如何,就功能而言,最接近两者组合的是 Lua。但是请注意,这不一定比LRANGE&表现更好DEL

$ cat popall.lua 
local r={}
local e=redis.call('LPOP', KEYS[1])
while e do
    r[#r+1]=e
    e=redis.call('LPOP', KEYS[1])
end
return r
$ redis-cli LPUSH list 1 2 3 4 5 6 7 8 9
(integer) 9
$ redis-cli --eval popall.lua list
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
6) "4"
7) "3"
8) "2"
9) "1"
$ redis-cli EXISTS list
(integer) 0
于 2016-11-28T08:06:57.753 回答