如何遍历线上redis所有key
2016 年 8 月 26 日, iamjs, 0
众所周知,redis是一个内存数据库,在使用redis时,不像mysql那样我们可以很方便看到数据库中各个key的大小以及分布情况。当线上实例出现超载问题时,我们要怎么去判断当前实例中有效数据是哪些?redis自带了一个命令keys,我们可以通过keys * 的方式获取所有的数据键名,但是这个操作是阻塞式的,如果在一个数千万key的高吞吐量数据库中执行这个命令,对线上的影响可想而知。因此在新版本的redis中,提供了一个新的命令scan。
SCAN 命令是一个基于游标的迭代器(cursor based iterator): SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。因为它每次都只便利一小部分数据,每次操作对应的时间复杂度是O(1)。
缺点:只支持version>=2.8
使用实例:
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