整体拿秒杀举例子:skuId,skuContent,skuStore

查询热点

查询热点是指对于skuId来说,它的skuContent需要展示,因为数据库的IO连接池是固定的,所以数据库存储的量是有限的,所以就需要将热点数据同步到redis中

缓存一致性

  1. 删除优于更新,因为更新不是原子化的操作
  2. 如果先删除缓存,然后再更新数据库,然后写入,这样会在写入的时候产生不一致
  3. 所以要进行延迟双删策略

热点缓存处理

基本就是对热点数据提前进行预热,让他们不直接打到db中,如果访问流量超级大,连redis都不能扛住的话,就要考虑如下几个措施:

  1. 将大key进行分片,譬如将skuId按照一致性hash算法hash成不同的key,然后存储到redis中
  2. 多级缓存,浏览器,cdn,本地和redis中都存储一份
  3. 分段请求,譬如用户刚加载的时候就请求相关热点数据,到真正进入页面的时候就不用请求了

写入热点

当有一个skuId成为热点的时候,数据库的更新也会成为一个大问题,直接更新数据库可能会导致rt很高,因为rc隔离级别下,是会对skuId的那一行加锁的,所以可以考虑如下方式:

  1. 将sku分到不同的数据库中,进行库存扣减少
  2. 扣减redis,然后通过redis发送消息给db,进行扣减少
  3. 直落明细,然后通过明细异步更新库存(更新的时候需要查询明细的sum)
  4. 按照skuId在应用层进行限流,防止打到db
  5. 搞一个热点库,把热点商品挪到热点库中

注意:通过乐观锁,保证库存扣款的一致性问题