keys和scan都可以遍历数据库中查找符合特定模式的key
1、KEYS pattern
比如:
keys *
keys cmd*
2、SCAN cursor [MATCH pattern] [COUNT count]
cursor:查询游标,第一次0,后面就是使用返回数组中第一个值,当返回的值为0时则表示遍历完毕。
MATCH pattern:匹配一个表达式,同上,选填。
[COUNT count]:指定每次迭代返回元素的最大值的一种提示(默认值为 10),但是在大多数情况下,
这种提示都是有效的,因此,返回的个数在count左右。
keys
1.没有offset、limit参数,不能限制查询个数
2.keys是遍历算法,复杂度O(n),数据量大的时候会导致redis卡顿
scan
1.复杂度O(n),但是scan是通过游标分步进行,不阻塞
2.提供limit,可控制返回结果数
3.同keys一样,提供模式匹配
4.服务器不需要为游标保存状态,唯一状态是scan返回客户端的游标整数
5.返回结果可能重复,需要客户端去重
6.如果遍历过程中有数据修改,改动后的数据不保证同步
7.单次返回结果是空的,不表示遍历结束,而要看返回的游标值是否为0
Redis 是单线程程序,是按照顺序执行指令的,如果说我们现在正在执行 keys 命令,那么其它指令必须等到当前的 keys 指令执行完了才可以继续,再加上 keys 操作是遍历算法,复杂度是 O (n),当实例中数据量过大的时候,Redis 服务可能会卡顿,其余指令可能会延时甚至超时报错
所以官方的建议是:生产环境屏蔽掉 keys 命令。