命令使用准则

最近更新时间: 2024-06-12 15:06:00

关注O(N)命令中的N

  • hgetall、lrange、smembers、zrange、sinter等命令建议不要使用的过多,但非不能使用,需要明确N的值。

  • CRedis中的hscan、sscan和zscan命令可以用于遍历哈希表、集合和有序集合。这些命令可以通过迭代器逐步扫描数据集中的元素,而不会像hgetall、smembers和zrange那样一次性返回所有元素。在实际使用中,建议在使用这些命令时指定合适的COUNT参数,以避免一次性返回过多的元素导致Redis的性能下降。通常情况下,每次遍历返回1000个元素左右是比较合适的选择。但是具体的数量限制还取决于Redis的实际环境和硬件配置,需要根据实际情况进行调整。

禁用命令

禁止线上使用keys、flushall、flushdb等,因为CRedis 是单线程工作,这些命令执行时间过长,易导致命令执行阻塞。建议通过scan的方式渐进式处理,或通过参数disable-command-list配置禁用命令。

  • FLUSHDB 和 FLUSHALL:这两个命令可以清空Redis中的所有数据,因此在生产环境中应该避免使用。

  • KEYS:此命令可以返回与指定模式匹配的所有键,但由于它会阻塞Redis服务器,因此在生产环境中不建议使用。

  • RANDOMKEY:此命令可以随机返回一个键,但由于它会阻塞Redis服务器,因此在生产环境中不建议使用。

  • INFO:此命令可以返回Redis服务器的各种统计信息和配置选项,但由于它会阻塞Redis服务器,因此在生产环境中不建议使用。

  • CONFIG:此命令可以用于修改Redis服务器的配置选项,但由于它可能会导致服务器崩溃,因此在生产环境中应该谨慎使用。

  • SHUTDOWN:此命令可以关闭Redis服务器,但由于它会导致数据丢失,因此在生产环境中应该避免使用。

  • BGREWRITEAOF 和 BGSAVE:这两个命令可以用于异步地重写AOF文件和RDB快照文件,但由于它们可能会消耗大量的系统资源,因此在生产环境中应该谨慎使用。

合理使用Select

Redis多数据库采用递增数字的命名方式,在使用过程中可随时使用SELECT更换数据库,数据库索引号 Index 用数字值指定,以 0 作为起始索引值。 Redis支持多数据库操作方式,在标准版场景客户可以根据多DB进行数据区分。但是Redis本身是单线程处理数据,即使使用多DB,业务请求也会受到其他DB操作影响。在集群版场景,建议客户优先使用0号DB,非0 DB不支持扩容。并且在客户请求时,可以不执行select 0,减少非必要交互。

适当使用批量操作

应用侧访问 CRedis,其中较多一部分耗时是网络rtt。如果应用需要做大量的get 或者set,可以适当使用mget、mset进行批量数据操作,降低网络rtt开销。使用mget、mset 一般元素个数不建议超过500个,mget和mset操作的key越多时,由于需要汇总所有key的执行结果统一返回,在后端如果出现抖动或者扩容迁移时,对业务影响也会存在放大。

  • 原生命令:例如mget、mset。

  • 非原生命令:可以使用pipeline提高效率。

    说明:

    注意控制一次批量操作的元素个数,建议在500以内,同时注意批量操作的元素中是否有Big key。

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

不建议使用事务

Redis的事务功能较弱,不支持回滚,而且集群版本要求一次事务操作的 Key 必须在同一个Slot上。

集群版使用Lua的特殊要求

  • 所有 Key 都应该由 KEYS 数组来传递,redis.call/pcall 里面调用的 Redis 命令,Key 的位置,必须是 KEYS array, 否则直接返回如下错误信息。error,"-ERR bad lua script for redis cluster,all the keys that the script uses should be passed using the KEYS array"

  • 单个Lua脚本操作的Key必须在同一个节点上,否则直接返回如下错误信息。error, "-ERR eval/evalsha command keys must in same slotrn"

关于monitor命令

Monitor 本身对 Redis 的性能有一定的影响,日常使用时,只用于分析命令的执行,不用于监控。若不进行相关问题排查和分析时,不建议开启。必要情况下,使用 Monitor 命令时,需要注意及时停止,不要长时间开启。

禁止将Redis作为消息队列

严禁将 Redis 当作消息队列使用,否则可能会有容量、网络、效率、功能方面的多种问题。