Redis 大key

153 阅读2分钟

一般特征

  • 单个Key存储大value
  • hash、set、zset、list中存储过多数据
  • 一个集群存储了上亿的key

具体描述

  • 一个STRING类型的Key,它的值为5MB(数据过大)。
  • 一个LIST类型的Key,它的列表数量为20000个(列表数量过多)。
  • 一个ZSET类型的Key,它的成员数量为10000个(成员数量过多)。
  • 一个HASH格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)

命令行

redis --bigkeys

场景:string的长度有10M

整存整取

一般对string操作都是整存整取,可以尝试将对象拆分成多个key-value,使用multiGet获取值,这样分拆意义在于分拆操作的压力,将操作压力平摊到多个redis实例,降低对于单个redis的io压力。

部分存取

同样可以拆成几个key-value,也可以将这些存储在一个hash中,每个field代表具体属性,使用hget、hmget来获取部分value,使用hset、hmset来更新部分属性

场景:hash的成员数目达到了10W

可以采用分段hash,将一个hash拆分为多个hash。

存取的时候,先计算相应的hash key即可

场景:一个集群存储了上亿的key

利用hash将很多string聚合起来,可以大量减少key的数目。

redis中的key尽量加上过期时间

场景:zset存储了全局排行榜

实现排行榜时,往往需要存储全服数据,zset的成员数目会很大。

可以设置上榜的阈值,将大量无效的数据挡住。

根据业务需求,尽量将不影响排行结果的数据挡住,降低zset的成员数目