
# 部分命令使用限制
本章节主要介绍部分Redis命令使用时的限制。
#### Key相关命令使用限制
使用KEYS命令时，若缓存数据量较大，可能会较长时间阻塞其它业务命令操作，甚至可能过高占用额外内存。因此使用KEYS命令时请尽量描述精确的pattern、不要使用"keys \*"进行全通配。keys \*会遍历所有数据，持续占用CPU，影响客户业务稳定性。建议尽量避免在生产环境使用，否则会影响服务的健康运行。
#### Server相关命令使用限制
- 当用户执行比较耗时的命令（如flushall）时，可能会导致缓存实例在命令执行期间对外不响应用户的其它命令，造成状态监控失效，此时Console上缓存实例的状态会变成异常，命令执行结束后，实例状态会恢复正常。
- 使用FLUSHDB、FLUSHALL命令时，若缓存数据量较大，可能会较长时间阻塞其它业务命令操作。
- 不建议在业务高峰使用MONITOR命令，在高并发的场景下执行MONITOR命令可能会影响实例性能，增加时延。
 
#### EVAL和EVALSHA相关命令使用限制
- 使用EVAL和EVALSHA命令时，命令参数中必须带有至少1个key。否则客户端会提示"ERR eval/evalsha numkeys must be bigger than zero in redis cluster mode"的错误。
- 使用EVAL和EVALSHA命令时，DCS Redis集群实例使用第一个key来计算slot，用户代码需要保证操作的key是在同一个slot，具体请参考[Redis命令](https://redis.io/commands)。
- 使用EVAL命令时：
  - 建议使用前先了解Redis的lua脚本特性，具体可参考[Lua脚本](https://redis.io/docs/latest/develop/programmability/eval-intro/)。
  
  - lua脚本的执行超时时间为5秒钟，建议不要在lua脚本中使用比较耗时的代码，比如长时间的sleep、大的循环等语句。
  
  - 调用lua脚本时，建议不要使用随机函数去指定key，否则在主备节点上执行结果不一致，从而导致主备节点数据不一致。
   
 
#### Lua脚本调试命令
Proxy集群和读写分离实例在执行Lua脚本调试命令时，仅支持异步非阻塞--ldb模式，不支持同步阻塞--ldb-sync-mode。且每个Proxy节点默认限制并发2个。其他Redis实例类型无此限制。
#### 其他限制
- 单个Redis命令处理时长限制为15秒左右，超过15秒未处理完，会导致客户的其它业务失败，因此内部会触发主从倒换。
- 2018年7月10日前创建的Redis集群实例需要升级才支持以下命令： SINTER、 SDIFF、SUNION、PFCOUNT、PFMERGE、SINTERSTORE、SUNIONSTORE、SDIFFSTORE、SMOVE、ZUNIONSTORE、ZINTERSTORE、EVAL、EVALSHA、BITOP、RENAME、RENAMENX、RPOPLPUSH、MSETNX、SCRIPT LOAD、SCRIPT KILL、SCRIPT EXISTS、SCRIPT FLUSH。
  
 
