Redis的缓存穿透问题、缓存击穿和雪崩问题?

缓存穿透:就是访问redis中一个不存在的key的时候,会直接穿过缓存,去数据库中进行查询.

      如果是黑客,进行恶意攻击的时候,每次都请求超过2000个/秒的时候,这个时候mysql基本上就挂了.

解决办法是:

1.缓存空值

每次从数据库中查询到一个不存在的key的时候,就写一个空值到缓存库中,有恶意攻击的时候,直接从缓存中取到这个空值.

2.布隆过滤器

先查询布隆过滤器,再查询redis,如果布隆过滤器中不存在则直接返回。需要预热。

 

 缓存击穿

缓存击穿指的是:这个key在数据库中存在,但是这个key查询的太多,并且这个key过期,所有的可以都打在数据库上,这个时候造成的数据库宕机。

解决方案:

1.设置热点永不过期

2.设置分布式锁

 

缓存雪崩:就是每秒有5000个请求过来时候,redis缓存库崩了,然后这些请求瞬间落在了mysql数据库上,直接导致数据库死机.

解决方案就是:

  事前:提高缓存库的高可用,  使用主从结构加哨兵  cluster集群, 

  事中:使用ehcache+hystrix限流组件(当请求量非常巨大的时候,就调用自己开发好的一个降级饿组件,返回一些默认值,如友情提示,或者空白值)

  事后:做持久化,尽快恢复缓存集群,一旦恢复,自动从磁盘上读取数据,恢复内存中的数据.

 

好处3:只要有2/5的请求可以被处理,就意味着你的系统没有死掉,对用户来说,就是可能点击几次刷新不出来页面,但是可能多点几次,就会刷新出来一次.

 

posted @ 2019-07-02 00:52  King-DA  阅读(172)  评论(0编辑  收藏  举报