redis-热key 大key

77 阅读3分钟

前言

不管是热key,还是大key,都是拆分。为什么要拆分?因为热点数据所在节点请求量太大,所谓拆分,就是把热点数据拆分到多个节点,从而减轻某一个节点的请求压力。

热key

应用场景

支付公司,某一个商户号(大商户)交易量特别大,但是这个商户号的缓存是在某一个节点,那怎么减轻该节点的压力?

方案1-拆分

没拆分之前,就是:商户号A/商户信息。

拆分之后,变成:商户号A1/商户信息,商户号A2/商户信息,商户号A3/商户信息。说白了,就是把同一个商户号A变成多个商户号。只要能变成多个商户号,那么就可以路由到不同节点,这样就是拆分,这样就减轻了某一个节点的压力。

那一个商户号怎么才能变成多个商户号?加一个随机数。比如商户号A1,第一次读的时候,如果redis节点没有缓存,那么就会写入缓存:商户号A1/商户信息。下次再读商户号A1的时候,就有缓存了。

方案2-本地缓存

既然热key在某一个redis节点,那为了缓解该redis节点的压力,可以在本地,即每个服务使用本地缓存。

这也算是分片,只不过是采用本地缓存的方案,把请求压力转移到了各个服务的本身。

广泛的理解,分片方案的本质,就是把请求压力分片到不同节点,无论是分片到不同redis节点,还是分片到各个服务本身。

大key

应用场景

比如某个网站,缓存了用户信息,数据结构是map:即user:用户id/用户信息。

key是user。value是map。但是如果用户信息太多,那么这个value的值就太大了,相当于所有用户信息都缓存在同一个key,也就是缓存在同一个redis节点。

那这个时候怎么办呢?怎么解决呢?

方案-拆分

核心思想还是拆分。

具体怎么拆分?既然所有用户信息都在同一个节点,那我们的目标就是拆分到不同节点。

怎么才能拆分到不同节点?之前是用map数据结构,现在用字符串。

拆分之前:user:用户id/用户信息。

拆分之后:user-用户id:用户信息。即,现在的key是user-用户id,value是字符串——而不是map。这样的话,每个key都不一样,就像热key的商户号拆分一样,现在不同的用户路由到不同节点。

总结

总共有几个维度,一个维度是key,单个key拆分为多个key,这样就分片了。

一个维度是使用不同的数据结构,比如map改为字符串。

一个维度是本地缓存。

总之,就是基于这些维度,去朝着分片的方向拆分。