缓存穿透
解释:
当一个请求访问的数据不存在于缓存中时,会直接向底层数据库中读取数据。而如果底层的数据库也没有该数据,则该数据不会被写入缓存中。如果下次继续有请求访问到该数据时,缓存中还是没有,还是会访问底层数据库。如果访问的量很大,底层数据库可能会很容易嗝屁。
解决办法:
1)缓存设置空值
当请求访问的数据在缓存与数据库中都没有 key 时,就设置一个空值数据写入缓存,并为该数据设置一个较短的过期时间。这样子如果后续有大量请求访问到该数据时,就不会在去查询底层的数据库。
2)布隆过滤器
采用布隆过滤器判断数据是否存在。
布隆过滤器原理:
通过K个散列函数将一个元素映射成一个位数组中的K个点,把它们置为1。 当有请求需要访问某个数据元素时,会对该元素也进行映射并检索,如果有一个位置上不为1则一定不存在于该集合, 若都为1则可能存在于该集合。
缓存击穿
解释:
当大量请求要访问到某个数据时, 该数据刚好过期 这时所有请求都会去访问更底层的数据库。 如果访问的量很大,底层数据库可能会很容易嗝屁。
解决办法:
1)加互斥锁
在多个请求中, 只有第一个请求线程能拿到锁并执行数据库的查询查询操作,其他请求线程都会被阻塞。 (第一个请求线程会因为缓存中没有需要查询的数据而去更底层的数据库中进行查询)等到第一个请求线程在跟底层的数据库中查询到数据时,数据会被写入到缓存中,这时后续的请求就可以直接访问到缓存中的数据。
2)热点数据永不过期处理
被访问次数非常多的数据 在缓存中做永远不会过期的处理。
缓存雪崩
解释:
当大量请求访问到多个多个不同的热点数据时,这些数据刚刚好过期被清除 这是所有请求都会去访问更底层的数据库。 如果访问的量很大,底层数据库可能会很容易嗝屁。和缓存击穿有点像,类似于加大码的缓存击穿。
解决办法:
1)热点数据永不过期处理。
同“缓存击穿”里的方法一致。
2)加互斥锁。
同上“缓存击穿”里的一致。
3)缓存时间均匀分布
将缓存数据的过期时间均匀的分布, 尽量避免多个缓存在同一时间过期。