redis:大key优化方案

大Key的特征

一般特征:

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

具体描述:

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

在实际业务中,大Key的判定需要根据实际场景来进行综合判断。

命令行

redis --bigkeys

output:
------- summary -------

Sampled 177789 keys in the keyspace!
Total key length in bytes is 4008570 (avg len 22.55)

Biggest   list found '"WebHistory"' has 1000 items
Biggest   hash found '"DirtyDatas"' has 163321 fields
Biggest string found '"UserProfile_0_209062"' has 23081 bytes
Biggest   zset found '"RedisMainLevel"' has 3633 members

143 lists with 3071 items (00.08% of keys, avg size 21.48)
7677 hashs with 186480 fields (04.32% of keys, avg size 24.29)
169948 strings with 9067139 bytes (95.59% of keys, avg size 53.35)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
21 zsets with 5179 members (00.01% of keys, avg size 246.62)

场景: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的成员数目。

posted @ 2022-05-23 11:42  天下太平  阅读(1393)  评论(0编辑  收藏  举报