引入缓存的时候,咱们失常是这样做的,先判断缓存是否有数据,如果有数据,从缓存返回数据,如果没有数据,则从数据库查问。流程如下:
通过缓存,咱们的零碎能够反对大量的并发,然而如果产生了一下事件,则会发送缓存雪崩:
1、同一时间,大量的缓存生效工夫到期。
2、缓存不可用。
3、热点问题。
此时缓存是没有数据或者不可用,则大量的申请间接到数据库,数据库撑不住这么大的并发,间接解体。只管始终重启数据库,还是撑不住要解体。
针对 1 的问题,咱们能够对 key 设置一个随机值的过期工夫,扩散他们的过期工夫。
针对 2 的问题,咱们次要是要保障缓存的可用性,比方 redis 的主从,redis 的哨兵,redis 的集群。同时,还要保障 redis 的长久化,这样重启后可能疾速复原缓存里的内容。
如果没有做长久化,那启动 reids 的时候,大量的申请是没有缓存间接申请数据库,一样会让数据库解体。
针对热点问题,即使 redis 做了分片,然而热点的 key 还是只能达到指定的 redis 服务器,此时 redis 服务器如果撑不住了,就会让申请拜访数据库,导致数据库解体。
解决方案如下:先查本地缓存,再查 redis,最初查数据库。此时数据的一致性没方法做保障的,比方 redis 和本地缓存的不统一。本地缓存的过期工夫要小于 redis 的过期工夫,这样尽量放大不统一的工夫。流程如下:
本地缓存是存在于利用中的,利用是能够扩容的,而单点的 redis 是没法比扩容的,所以把压力分担到利用中,来解决热点问题