假设我们要进行抽奖,或者秒杀什么的,奖品只有一个,如果用户量不大比如几千上万,那么正常可以直接一个redis库存控制即可。
但是,如果我们并发量超级大,一个redis key可能就会存在热点问题了,毕竟就算redis是集群的,但是一个key也只会在一个分片上,此时我们可以有多个分片法。
具体的做法是根据流量大小,将一个库存分成多个库存。比如奖品A,我们可以把A的库存分成5个。redis中就是
A_1;A_2;A_3;A_4;A_5;
那么我们每次请求,先随机生成5个数的排序,比如
[1,5,4,3,2]
那么我们就可以按顺序扣减库存,扣减到有库存的为止,这里随机的目的就是防止每次都从1开始想到与还是有热点问题。
后续可能有些分片没有库存了,那么我们只需要多加点逻辑把没有库存的就不参与随机数的计算即可。