Redis - 一个一个地插入字符串并一次全部删除的数据结构

Redis - data structure to insert string one by one and remove all at once

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

P.S:我不想在检索时去掉key,我只需要检索并清空列表即可。

听起来你应该使用 List. Add to the list with either LPUSH or RPUSH, then retrieve everything with LRANGE and DEL 密钥。

P.S。 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

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

您将使用 LPUSH to add items to the list. Note that the list doesn't need to exist for you to be able to perform this operation for the first time. This is a O(1)(constant time) operation so that's as fast as you can get. To retrieve all items you will use LRANGE 0 -1. This will end up being O(N) which is the same as SMEMBERS (the analogous set operation). Finally you will use DEL,这又将是 O(N),并且无论您使用集合还是列表,都将具有相同的性能。

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

您也可以使用 APPEND if you have some character that you can use as separator. It's O(1). Then you can get the whole string and reset it using GETSET。缺点是,如果需要的话,您将不得不在自己的代码中再次将其转换为列表。