分布式缓存服务 DCS-DCS使用建议:命令使用规范

时间:2024-07-29 19:46:22

命令使用规范

原则

原则说明

备注

谨慎使用O(N)复杂度的命令

时间复杂度为O(N)的命令,需要特别注意N的值。避免N过大,造成Redis阻塞以及CPU使用率冲高。

例如:hgetall、lrange、smembers、zrange、sinter这些命令都是做全集操作,如果元素很多,会消耗大量CPU资源。可使用hscan、sscan、zscan这些分批扫描的命令替代。

禁用高危命令

禁止使用flushall、keys、hgetall等命令,或对命令进行重命名限制使用。

请参考命令重命名的内容。

慎重使用select

Redis多数据库支持较弱,多业务用多数据库实际还是单线程处理,会有干扰。最好是拆分使用多个Redis。

-

使用批量操作提高效率

如果有批量操作,可使用mget、mset或pipeline,提高效率,但要注意控制一次批量操作的元素个数。

mget、mset和pipeline的区别如下:

  • mget和mset是原子操作,pipeline是非原子操作。
  • pipeline可以打包不同的命令,mget和mset做不到。
  • 使用pipeline,需要客户端和服务端同时支持。

避免在lua脚本中使用耗时代码

lua脚本的执行超时时间为5秒钟,建议不要在lua脚本中使用比较耗时的代码。

比如长时间的sleep、大的循环等语句。

避免在lua脚本中使用随机函数

调用lua脚本时,建议不要使用随机函数去指定key,否则在主备节点上执行结果不一致,从而导致主备节点数据不一致。

-

遵循集群实例使用lua的限制

遵循集群实例使用lua的限制。

  • 使用EVAL和EVALSHA命令时,命令参数中必须带有至少1个key,否则客户端会提示“ERR eval/evalsha numkeys must be bigger than zero in redis cluster mode”的错误。
  • 使用EVAL和EVALSHA命令时,D CS Redis集群实例使用第一个key来计算slot,用户代码需要保证操作的key是在同一个slot。

对mget,hmget等批量命令做并行和异步IO优化

某些客户端对于MGET,HMGET这些命令没有做特殊处理,串行执行再合并返回,效率较低,建议做并行优化。

例如Jedis对于MGET命令在集群中执行的场景就没有特殊优化,串行执行,比起lettuce中并行pipeline,异步IO的实现,性能差距可达到数十倍,该场景建议使用Jedis的客户端自行实现slot分组和pipeline的功能。

禁止使用del命令直接删除大Key

使用del命令直接删除大Key(主要是集合类型)会导致节点阻塞,影响后续请求

Redis 4.0后的版本可以通过UNLINK命令安全地删除大Key,该命令是异步非阻塞的。

对于Redis 4.0之前的版本:

  • 如果是Hash类型的大Key,推荐使用hscan + hdel
  • 如果是List类型的大Key,推荐使用ltrim
  • 如果是Set类型的大Key,推荐使用sscan + srem
  • 如果是SortedSet类型的大Key,推荐使用zscan + zrem
support.huaweicloud.com/bestpractice-dcs/dcs-bp-191113001.html