如何遍历线上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进行数据的迭代遍历
mysql索引长度限制问题 redis操作监控器MONITOR