存储中的热点数据

299 阅读1分钟

问题

在电商领域或者微博业务中,总是会存在爆款商品或者热点事件,造成这些数据在很短时间内,产生了大量的访问。这时系统应该怎么设计?

缓存机制

最先想到的解决方案就是,加上Redis缓存。当访问这些热点数据时,不要直接去访问MySQL,而是直接放入Redis中。有个问题:这些请求都是并发的,这些请求都没有在Redis中找到数据,导致所有请求都穿透到了MySQL,MySQL怎么能抗的住。

一个比较常见的解决方案就是:对DB访问加一个分布式锁。关于分布式锁的实现可以参考这篇文章:关于redis分布式锁

redis热点

虽然Redis已经很快了,但是如果访问量就是很大,可能带宽、网卡成为瓶颈。即使使用Redis的cluster模式(cluster模式通过slot的方式将不同的数据打算,适合扩容),cluster的每个节点一般是主从模式,从节点只作为master的备份节点,一般不承担流量。这样的话,这些热key都打到了一个Redis节点上。

解决方法:

  • 让从节点扛读,这样可以一主拖多个从 cluster模式下,官方不推荐操作从库,从库只是作为failover使用。

image.png

  • 业务缓存 这些数据可以直接缓存在业务内存中,比如JVM缓存中。JVM缓存是有大小限制的,缓存哪些数据呢?这种一般跟业务密切相关。需要业务决定缓存哪些key。

参考

- 你所不知道的Redis热点问题以及如何发现热点