缓存击穿、穿透和雪崩

一、缓存击穿

缓存击穿是指一个热点key突然失效,从而导致大量的请求查询数据库。

预防缓存击穿的方案:

1、热点key不设置过期时间。

2、使用锁,当key失效时,只允许一个请求去读数据库并把数据刷到缓存中。

 

二、缓存穿透

缓存穿透是指查询一个一定不存在的数据,如查询id=-1的数据信息,由于缓存不命中(cache miss),还要到数据库去查,但是数据库也查不到,这时给查询请求返回空,并且不会写数据到缓存中,这样,下次同样的请求还是会到数据库去查,大量这样的请求将给数据库造成极大的压力从而失去了缓存的意义。

解决方案有两个:

1、第一次在数据库中查不到数据时,在给请求返回空的同时,也把空对象写到缓存中,这样以后再查的时候就会直接从缓存返回空了。

2、在缓存前加一个布隆过滤器,把所有可能的键都放在里面,这样如果查询不存在的键时,就直接从布隆过滤器返回了,连缓存都不用查。

参考博客:http://carlosfu.iteye.com/blog/2248185

 

二、缓存雪崩

缓存雪崩是指同一时间大量的缓存失效了,从而导致所有的查询都去数据库查,很可能导致数据库也挂掉。

预防缓存雪崩的方案:

1、key的过期时间加上一个随机值,以防止集中过期。

2、增加熔断机制。qps达到一定阈值时,返回兜底报错,保证服务不崩溃,保证一部分用户可用。

3、用redis集群保证缓存服务的高可用性。

4、提升数据库的高可用性,如分库分表、读写分离等。

参考博客:http://carlosfu.iteye.com/blog/2249316

 

posted on 2016-03-12 00:43  koushr  阅读(156)  评论(0编辑  收藏  举报

导航