1. 什么是缓存穿透?
缓存穿透(Cache Penetration)指的是对于一个不存在于缓存中的数据的请求,由于缓存无法命中,每次请求都要去查询数据库,导致数据库压力过大。攻击者可以通过故意请求不存在的数据来触发缓存穿透问题,从而使系统负载过高。
2. 如何解决缓存穿透问题?
2.1 返回空对象
就是当用户第一次请求到缓存,发现缓存没数据的时候,后端进行数据库的查询,这时数据库也没数据,这时后端就可以往redis中存入一个空值来进行填充,防止不发分子进行攻击数据库,导致数据库崩塌,等下次请求到达时,就会只访问redis,从而减轻了数据库的压力
2.2 布隆过滤器
具体原理:使用布隆过滤器(Bloom Filter)可以有效地解决缓存穿透问题。布隆过滤器是一种数据结构,可以用于判断一个元素是否存在于一个集合中,它的特点是高效地判断元素是否存在,但可能会有一定的误判率。
在解决缓存穿透问题中,可以将所有可能存在的数据的key都放入布隆过滤器中。当一个请求到达时,首先在布隆过滤器中判断该请求的key是否存在,如果不存在,则可以直接返回空值,避免对数据库的查询。如果布隆过滤器判断该key可能存在,则再去查询缓存,如果缓存中不存在该数据,则返回空值。
布隆过滤器的优势在于其快速的判断能力和较低的内存占用,可以减轻数据库压力。但需要注意的是,布隆过滤器可能会存在一定的误判率,即判断一个元素存在时,实际上该元素可能并不存在。因此,在使用布隆过滤器解决缓存穿透问题时,需要权衡误判率和内存占用之间的平衡,并根据实际情况进行调整和优化。
2. 什么是缓存击穿?
缓存击穿(Cache Breakdown)指的是对于一个热点数据的请求,由于该数据突然失效或被删除,导致大量请求直接绕过缓存,直接查询数据库,造成数据库压力骤增。通常情况下,缓存失效是由于设置了缓存的过期时间,或者手动删除了缓存数据。
原理同上图类似
2.1 如何解决缓存击穿?
可以采用热点数据永不过期的策略,或者在数据失效时,使用互斥锁(Mutex)来防止大量请求同时查询数据库,只允许一个线程去查询数据库,其他线程等待该线程查询完毕后再从缓存中获取数据。
3. 缓存穿透与缓存击穿的区别
缓存穿透是指请求的数据在缓存中不存在,导致每次请求都要查询数据库;缓存击穿是指热点数据突然失效或被删除,导致大量请求绕过缓存直接查询数据库。两者的解决方案也不同,缓存穿透可以通过在缓存中设置空值来避免频繁查询数据库,而缓存击穿可以通过设置热点数据永不过期或使用互斥锁来防止数据库压力过大。