Redis 千万不要乱用 KEYS 命令,不然会挨打的,面试必问
KEYS 命令要谨慎使用。
为何?客观别急,我们先一步步来看。
KEYS 命令
Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don't use KEYS in your regular application code. If you're looking for a way to find keys in a subset of your keyspace, consider using sets.
上面是官方文档声明,KEYS
命令不能用在生产的环境中,这个时候如果数量过大效率是十分低的。同时也不要用 KEYS 正则匹配,官方建议直接用集合类型。
有人说 KEYS
相当于关系性数据的库的 select *
,在生产环境几乎是要禁用的。
KEYS
命令的性能随着数据库数据的增多而越来越慢KEYS
命令会引起阻塞,连续的KEYS
命令足以让 Redis 阻塞
试想如果Redis
阻塞超过 10 秒,如果有集群的场景,可能导致集群判断Redis
已经故障,从而进行故障切换;
以上的情况严重会导致应用程序出现雪崩的情况。
然而,网上很多都是这么写的 redis-cli --raw keys "key前缀*" | xargs redis-cli del
,千万别照炒,拿到生产环境上做实验。
顺便普及下xargs
命令,这是 Linux 下的一个命令 。
xargs 命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道或者 stdin 并将其转换成特定命令的命令参数。xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs 的默认命令是 echo,空格是默认定界符。这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。xargs 是构建单行命令的重要组件之一。
SCAN 命令
Redis 从 2.8 版本开始支持 scan 命令,SCAN 命令的基本用法如下:
复杂度虽然也是 O(n),通过游标分步进行不会阻塞线程;
有限制参数 COUNT ;
同 keys 命令 一样提供模式匹配功能;
服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;
scan 用法
SCAN cursor [MATCH pattern] [COUNT count]
scan 命令提供三个参数,第一个是 cursor,第二个是要匹配的正则,第三个是单次遍历的槽位
第一个遍历是 cursor 值为 0,然后将返回结果的第一个整数作为下一个遍历的游标,如果最后返回的到 cursor 的值为 0 就代表结束。
127.0.0.1:6379> scan 0 MATCH tony*
"42"
"tony25"
"tony2519"
"tony2529"
"tony2510"
"tony2523"
"tony255"
"tony2514"
"tony256"
"tony2511"
"tony15"
127.0.0.1:6379> scan 42 MATCH tony*
COUNT 1000
"0"
"tony3513"
"tony359"
"tony4521"
"tony356"
"tony30"
"tony320"
"tony3"
"tony312"
返回分为两个部分如上面的代码中, 1)代表下一次迭代的游标,2)代表本次迭代的结果集
,注意如果返回游标为 0 就代表全部匹配完成。
评论