缓存穿透
- 概念
缓存穿透的概念其实很简单,就是用户想要查询一个数据,当缓存里面没有这个数据的时候,就会去数据库中查询,如果数据库也没有就查询失败。在高并发的情况下,大量请求到缓存中查询,没有查到数据,就会去数据库中查询,导致服务器压力非常大,这就相当于出现了缓存穿透。 - 解决方案
1、布隆过滤器
布隆过滤器是是一种数据结构,将所有可能查询的key放入布隆过滤器中,在用户请求到达缓存之前,用户请求查询的key在布隆滤器中进行筛选,如果不存在则直接丢弃。
2、缓存空对象
用户请求查询的数据在缓存以及数据库中都不存在时,在缓存中加入用户请求的key,设置值为空,这样下次请求这个key时就会直接返回空,不会查询数据库。但是如果设置空对象过多,会导致很多资源浪费,可以设定缓存的过期时间。
缓存击穿
- 概念
缓存击穿就是在缓存失效的瞬间,很多请求同时到达,这时缓存以及失效,所有请求会直接访问数据库,导致服务器压力变大。 - 解决方案
1、设置热点数据缓存永不过期(占用内存资源)
2、加互斥锁(在访问数据库时加锁!在缓存失效的时候,请求访问数据库,由于加锁的原因,只有一个线程能够访问数据库,缓解数据库压力)
缓存雪崩
- 概念
缓存雪崩就是指缓存由于某种原因不能正常工作了,所有请求直接访问数据库,数据库顶不住压力可能会出现服务崩掉的情况。 - 解决方案
1、Redis高可用!在搭建Redis集群的时候可以将服务器安装在不同地方,这样某一个机子宕机,集群中其他服务器可以正常使用。
2、限流降级!使用互斥锁保证在访问存储层只有一个线程访问数据库,控制数据库访问数量。
3、数据预热!在部署之前,可以先将数据访问一遍,数据会放入缓存中。对于可能大量查询的数据,在缓存中的过期时间尽量设置的均匀一点,尽量不要访问量大的缓存同时失效。