Redis热key和大key

所谓的热 key,就是指在很短时间内被频繁访问的键。

比如,热门新闻或热门商品,这类 key 通常会有大流量的访问,对存储这类信息的 Redis 来说,是不小的压力。

某天某流量明星突然爆出一个大瓜,微博突然就崩了,这就是热 key 的压力。

再比如说 Redis 是集群部署,热 key 可能会造成整体流量的不均衡(网络带宽、CPU 和内存资源),个别节点出现 OPS 过大的情况,极端情况下热点 key 甚至会超过 Redis 本身能够承受的 OPS。

OPS(Operations Per Second)是 Redis 的一个重要指标,表示 Redis 每秒钟能够处理的命令数。

通常以 Key 被请求的频率来判定,比如:

  • QPS 集中在特定的 Key:总的 QPS(每秒查询率)为 10000,其中一个 Key 的 QPS 飙到了 8000。
  • 带宽使用率集中在特定的 Key:一个拥有上千成员且总大小为 1M 的哈希 Key,每秒发送大量的 HGETALL 请求。
  • CPU 使用率集中在特定的 Key:一个拥有数万个成员的 ZSET Key,每秒发送大量的 ZRANGE 请求。
    • HGETALL 命令用于返回哈希表中,所有的字段和值。
    • ZRANGE 命令用于返回有序集中,指定区间内的成员。

大 key 指的是存储了大量数据的键,比如:

  • 单个简单的 key 存储的 value 很大,size 超过 10KB
  • hash,set,zset,list 中存储过多的元素(以万为单位)

什么是大Key

通常我们会将含有较大数据或含有大量成员、列表数的Key称之为大Key,下面我们将用几个实际的例子对大Key的特征进行描述:

  • 一个STRING类型的Key,它的值为5MB(数据过大)

  • 一个LIST类型的Key,它的列表数量为20000个(列表数量过多)

  • 一个ZSET类型的Key,它的成员数量为10000个(成员数量过多)

  • 一个HASH格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)

需要注意的是,在以上的例子中,为了方便理解,我们对大Key的数据、成员、列表数给出了具体的数字。为了避免误导,在实际业务中,大Key的判定仍然需要根据Redis的实际使用场景、业务场景来进行综合判断。

什么是热Key

在某个Key接收到的访问次数、显著高于其它Key时,我们可以将其称之为热Key,常见的热Key如:

  • 某Redis实例的每秒总访问量为10000,而其中一个Key的每秒访问量达到了7000(访问次数显著高于其它Key)

  • 对一个拥有上千个成员且总大小为1MB的HASH Key每秒发送大量的HGETALL(带宽占用显著高于其它Key)

  • 对一个拥有数万个成员的ZSET Key每秒发送大量的ZRANGE(CPU时间占用显著高于其它Key)

参考