Redis - 逐个插入字符串并一次删除所有内容的数据结构

时间:2016-11-28 07:05:09

标签: data-structures redis redis-cli

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

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

3 个答案:

答案 0 :(得分:1)

听起来你应该使用List。使用LPUSHRPUSH添加到列表中,然后使用LRANGEDEL密钥检索所有内容。

P.S。 Redis中的一个键,例如存储List的键,不能为空。一旦删除了所有列表的成员,密钥本身就不再存在,因此您可以删除它而不是尝试清空它。

更新了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

答案 1 :(得分:1)

您可能希望使用简单的list来实现此目的。有一个原因你可能想要使用一套,但我稍后会这样做。

您将使用LPUSH将项目添加到列表中。请注意,您无需存在该列表,以便您能够首次执行此操作。这是O(1)(恒定时间)操作,因此您可以尽快获得。要检索所有项目,您将使用LRANGE 0 -1。这将最终为O(N),与SMEMBERS(类似的集合操作)相同。最后,您将使用DELO(N)也将SADD,无论您使用集合还是列表,都将具有相同的效果。

正如我所提到的,有一种情况你会在列表上使用一个集合。那是你想要防止重复但不关心订单的时候。在这种情况下,您将添加public void methodA() { while(something) { methodB(); } } public void methodB() { //Insert new client into Client table. } 成员并使用SMEMBERS检索所有成员。使用集合具有与使用列表完全相同的性能,除非您为唯一性交易订单。如果您想要防止重复但也关心订单,您将需要使用有序集。由于您需要跟踪分数,因此操作会稍微复杂一些,但它仍然相当简单。使用有序集合,您也将获得非常小的性能影响。这不是值得担心的,因为Redis 非常快。

答案 2 :(得分:1)

如果您有一些可用作分隔符的字符,也可以使用APPEND。它是O(1)。然后,您可以使用GETSET获取整个字符串并重置它。不足之处在于,如果您需要,则需要在自己的代码中再次将其转换为列表。