诺亚方舟

沉淀

如何遍历线上redis所有key

众所周知,redis是一个内存数据库,在使用redis时,不像mysql那样我们可以很方便看到数据库中各个key的大小以及分布情况。当线上实例出现超载问题时,我们要怎么去判断当前实例中有效数据是哪些?redis自带了一个命令keys,我们可以通过keys * 的方式获取所有的数据键名,但是这个操作是阻塞式的,如果在一个数千万key的高吞吐量数据库中执行这个命令,对线上的影响可想而知。因此在新版本的redis中,提供了一个新的命令scan。

SCAN 命令是一个基于游标的迭代器(cursor based iterator): SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。因为它每次都只便利一小部分数据,每次操作对应的时间复杂度是O(1)。

缺点:只支持version>=2.8

使用实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
127.0.0.1:6379> debug populate 33
OK
127.0.0.1:6379> keys *
 1) "key:15"
 2) "key:10"
 3) "key:31"
 4) "key:19"
 5) "key:7"
 6) "key:12"
 7) "key:28"
 8) "key:9"
 9) "key:13"
10) "key:20"
11) "key:4"
12) "key:5"
13) "key:21"
14) "key:25"
15) "key:22"
16) "key:6"
17) "key:11"
18) "key:26"
19) "key:16"
20) "key:0"
21) "key:8"
22) "key:3"
23) "key:29"
24) "key:24"
25) "key:30"
26) "key:27"
27) "key:2"
28) "key:23"
29) "key:17"
30) "key:32"
31) "key:18"
32) "key:1"
33) "key:14"
127.0.0.1:6379> scan 0
1) "42"
2)  1) "key:2"
    2) "key:31"
    3) "key:16"
    4) "key:4"
    5) "key:17"
    6) "key:12"
    7) "key:29"
    8) "key:24"
    9) "key:19"
   10) "key:7"
127.0.0.1:6379> scan 42
1) "25"
2)  1) "key:11"
    2) "key:20"
    3) "key:32"
    4) "key:25"
    5) "key:14"
    6) "key:22"
    7) "key:6"
    8) "key:9"
    9) "key:23"
   10) "key:0"
127.0.0.1:6379> scan 25
1) "7"
2)  1) "key:10"
    2) "key:13"
    3) "key:30"
    4) "key:27"
    5) "key:21"
    6) "key:15"
    7) "key:8"
    8) "key:3"
    9) "key:5"
   10) "key:18"
   11) "key:1"
127.0.0.1:6379> scan 7
1) "0"
2) 1) "key:26"
   2) "key:28"

scan每次返回的数据结构包含2个变量,一个是下次遍历对应的游标位置,一个遍历的数据集。
当游标位置为0时表示遍历完所有元素完毕。

下面是一个利用scan遍历所有键的例子:如何统计Redis中各种数据的大小

文章参考:redis用scan进行数据的迭代遍历

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>