缓存穿透,缓存雪崩和缓存击穿

Q: 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。

A:

1.布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力

2.如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。通过这个直接设置的默认值存放到缓存,这样第二次到缓存中获取就有值了,而不会继续访问数据库

Q: 缓存雪崩,是指在某一个时间段,缓存集中过期失效。

A:

1.加锁排队

2.给数据添加一个缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新缓存

3.为key设置不同的缓存失效时间

Q: 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

A:

1. 设置热点数据永远不过期。
2. 加互斥锁。 同一时间只能有一个线程查询数据库,其余等待。

原文地址:https://www.cnblogs.com/cnsec/p/13547572.html