Skip to content

Latest commit

 

History

History
27 lines (12 loc) · 1.77 KB

chapter9.md

File metadata and controls

27 lines (12 loc) · 1.77 KB

实战:缓存雪崩、缓存穿透、缓存击穿

缓存雪崩

缓存雪崩指的是缓存中有大量数据到了过期时间,数据库数据查询量增大,导致数据库压力过大宕机。

既然是因为到了过期时间造成的数据库访问压力过大,所以自然地能想到通过设置永不过期就能避免缓存雪崩。当然设置永不过期是有代价的,这需要我们付出更多的内存空间。

通常情况下,我们会设置随机过期时间,当然我们最好是根据不同的分类设置的过期时间。例如,热门的商品缓存时间更久一点,冷门的商品缓存时间段一点。

缓存穿透

穿透的含义是,请求穿过缓存直接请求数据库。对于正常的请求,这样的“穿透”是允许存在的。但如果是恶意的请求,故意请求不存在的值,例如ID=-1等,这样大量恶意请求到数据库,一样会造成数据库压力过大。

解决的办法一是可以通过业务方式解决,例如,我们在业务层先验证值得有效性,过滤ID<0的请求直接返回错误等。

我们也能对非法的值,在请求到数据库后,将它写入缓存,这样在下次请求时就会直接访问到缓存,避免二次请求到数据库。

缓存击穿

缓存击穿主要是某一个key持续承担了大量的访问压力,在失效过期的瞬间导致所有请求全部请求到了数据库,同样造成数据库的压力。

这样的场景,最简单的办法仍然是设置key永不过期。有的解决办法是访问数据库操作加上互斥锁,我认为这样的操作有点过度,还不如加强对缓存的管理,并且可以实时监控key的压力情况以及失效过期情况,以便能动态的配置缓存的过期时间。