# 生产环境谨慎使用keys命令

## keys命令的使用 <a href="#yi-keys-ming-ling-de-shi-yong" id="yi-keys-ming-ling-de-shi-yong"></a>

进入redis-cli之后，我们通常比较关心的是有哪些key(当然也可以用其他客户端工具)，那么就不得不说keys命令

* **keys命令语法**

? 匹配一个字符

\* 匹配任意个（包括0个）字符

\[] 匹配括号间的任一个字符，可以使用 "-" 符号表示一个范围，如 a\[b-d] 可以匹配 "ab","ac","ad"

\x 匹配字符x，用于转义符号，如果要匹配 "?" 就需要使用 \\?

* **获取当前库下的所有key**

```
keys *
```

如下图所示，存在四个key:redis01、redis11、hbase01、hbase11

![](https://3658031099-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ltduzplg1A9tUmZn33J%2F-Ltdv-u5LtmboKF-q5Fq%2F-Ltdv7AKoYZTeJMUO4Y1%2Fimport-redis-01.png?generation=1573735139099742\&alt=media)

* **查找以redis开头的所有key**

```
keys redis*
```

![](https://3658031099-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ltduzplg1A9tUmZn33J%2F-Ltdv-u5LtmboKF-q5Fq%2F-Ltdv7AM4ALzZ0v6KO-o%2Fimport-redis-02.png?generation=1573735139236126\&alt=media)

* **查找以hbase开头、第6位为任一字符、以”1”结尾的key**

```
keys hbase?1
```

![](https://3658031099-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ltduzplg1A9tUmZn33J%2F-Ltdv-u5LtmboKF-q5Fq%2F-Ltdv7AOI4aRSnm340_m%2Fimport-redis-04.png?generation=1573735139572815\&alt=media)

* **\[]，这和正则表示中的\[]类似，每次可以配其中任何一个字符。**

```
keys redis[01]1
```

> 会匹配”redis01”和”redis11”,“2”不再【01】中，所有”redis21”未能匹配上

![](https://3658031099-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ltduzplg1A9tUmZn33J%2F-Ltdv-u5LtmboKF-q5Fq%2F-Ltdv7AQt3-duSuH0K8W%2Fimport-redis-03.png?generation=1573735139140165\&alt=media)

## 利用keys的模糊匹配带来的性能问题 <a href="#er-li-yong-keys-de-mo-hu-pi-pei-dai-lai-de-xing-neng-wen-ti" id="er-li-yong-keys-de-mo-hu-pi-pei-dai-lai-de-xing-neng-wen-ti"></a>

***从上面开来，keys的模糊匹配功能很方便也很强大，但是在生产环境需要慎用！因为Keys，开发中使用keys的模糊匹配，会引发Redis锁，并且增加Redis的CPU占用***

> 还有就是虽然redis存取很快，但是正常生产环境，redis服务器肯定和web服务器不是在一起，有时候甚至是在不同的地区，所以网络通信延迟就很重要了，所以要减少存取次数，一次存取完成更多的工作，否则你会发现做同样的事redis还没有关系型数据库快，所以redis存的时候一定要有技巧，尽可能减少存取次数。

那怎么解决这种类似的keys模糊匹配问题呢？其中常见的方法就是设置一个set，将需要使用的keys存储在set中。
