Redis的key里的大括号会影响指令的路由

发现问题

系统压测时发现Redis集群的某个节点出现CPU过高的情况,使用Redis阿里云控制台的[实时TopKey统计]功能发现某一高频写Redis的功能使用的几个key都被路由到了同一个Redis节点,key形如

  • {cache}:::table_name:::field1
  • {cache}:::table_name:::field2

解决问题

阿里云提供了一些文档进行Redis的基本的性能优化 性能调优_云数据库 Redis 版(Redis)-阿里云帮助中心 但是显然多个高频写的key被路由到同一个节点导致CPU升高的问题不是Redis自身的优化能够解决的

阿里云的Redis集群是Redis cluster的实现,查询Redis cluster的文档后发现了问题

关于Redis cluster的简要描述 overview-of-redis-cluster-main-components , Redis使用CRC16算法对key进行hash, hash值再对cluster的size取模后决定路由的节点

使用 CLUSTER KEYSLOT | Redis 命令查询这几个key的hash值都是相等的,为什么?

hash-tags 哈希标签是一种确保多个键分配在同一个哈希槽中的方法。这用于在 Redis Cluster 中实现多键操作。为了实现哈希标签,在某些条件下,密钥的哈希槽的计算方式略有不同。如果密钥包含“{…}”模式,则仅对和之间的子字符串进行哈希 {处理}以获取哈希槽

样例里的几个key使用了共同的”{cache}”前缀导致Redis计算hash时只计算了”cache”这5个字符的hash值,导致几个key路由到了同一个节点

其他

进行修复时要注意这几个key的读操作和写操作的服务,必要时可以对读服务进行灰度发布,保证旧的key全部被消费、写服务全部更新为新key后再全量发布读服务