我是新手Redis
,发现有各种数据结构支持Redis
并根据要求我们可以选择其中任何一种。我的要求是将字符串一一插入到列表(key-list
)中,并希望一次检索(并删除)所有内容。而且我也想经常这样做,所以试图找到一种最佳方式。哪种数据结构/方式会更好?先感谢您
PS:我不想在检索时删除密钥,我只需要检索并清空列表。
我是新手Redis
,发现有各种数据结构支持Redis
并根据要求我们可以选择其中任何一种。我的要求是将字符串一一插入到列表(key-list
)中,并希望一次检索(并删除)所有内容。而且我也想经常这样做,所以试图找到一种最佳方式。哪种数据结构/方式会更好?先感谢您
PS:我不想在检索时删除密钥,我只需要检索并清空列表。
您可能希望使用一个简单的列表来实现此目的。您可能想要使用一组有一个原因,但我稍后会谈到。
您将使用LPUSH
将项目添加到列表中。请注意,您无需存在该列表即可首次执行此操作。这是一个O(1)
(恒定时间)操作,因此您可以获得尽可能快的速度。要检索您将使用的所有项目LRANGE 0 -1
。这最终将O(N)
与SMEMBERS
(类似的设置操作)相同。最后,无论您使用集合还是列表,您都将DEL
再次使用 which将具有相同的性能。O(N)
正如我所提到的,在一种情况下,您会在列表上使用集合。那是您想要防止重复但不关心顺序的时候。在这种情况下,您将添加成员SADD
并使用 检索所有成员SMEMBERS
。使用集合与使用列表具有完全相同的性能,只是您是为了唯一性而交易订单。如果您想防止重复但又关心顺序,您将需要使用排序集。操作会稍微复杂一些,因为您需要跟踪分数,但它仍然相当简单。使用排序集也会对性能造成非常小的影响。这不用担心,因为 Redis非常快。
听起来你应该使用List。LPUSH
使用或添加到列表中,然后使用和键RPUSH
检索所有内容。LRANGE
DEL
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