redis三大缓存问题之缓存穿透(缓存穿透问题+解决方案+布隆过滤器)
前面学习了redis的基础知识,接下来将对redis三大缓存问题进行分享,本文先从缓存穿透问题开始。首先介绍什么是缓存穿透以及怎么出现的,然后对此介绍常用的解决方案,包括布隆过滤器、缓存空对象等解决方案介绍,通过实战代码通过SpringBoot搭建redis,mysql环境在代码级别对缓存穿透问题和解决方案应用进行直观展示。
本文基于的代码环境:代码使用SpringBoot集成mybatis+mysql+redis的方式,本文缓存穿透问题仅采用redis单机模式,在另一台电脑主机的linux虚拟机上发布一个单机redis环境,详细linux部署单机redis环境的步骤可参考小编redis专栏的文章。mysql环境采用本机win7系统安装mysql5.7版本并启动mysql服务。由于在代码中有关于redis和mysql的连接配置,因此前提必须保证这redis和mysql环境是可用的,否则工程代码在启动时会相应报错。
好了,在此前提下,开始介绍本文的主题:redis缓存穿透
(一)什么是redis缓存穿透,怎么出现?
redis缓存穿透:指某个查询的key在缓存中不存在,然后跳过了缓存转而频繁去查询数据库,从而导致数据库的压力很大的现象。
可以用下面的图进行展示:
(二)有什么常用的解决方案?
针对上面的问题,我们可以从redis层面和数据库层面进行考虑。在redis层面上,我们自然希望有尽可能多的key会缓存在redis中,通过redis就可以抵挡大部分的数据库请求,理想的请求应该是:
而实际上请求难免会到达数据库,因此我们可以引出下面的处理方案:缓存空对象。
缓存空对象就是通过key在redis中不存在第一次查询数据库,但是数据库查询的结果为空时,可以往redis中给这个key缓存一个空对象,那么下次这个key再次请求的时候,就会命中redis的空记录直接返回给用户:
但是从上面图也可以看出,这种方案只能解决同一个key频繁请求的缓存穿透问题,多个不同key频繁请求时依然会存在缓存穿透问题,为了解决这种多个不同key频繁请求可能导致缓存穿透的问题,我们就引出了布隆过滤器的解决方案。
(三)什么是布隆过滤器,原理,有何应用?
(四)代码演示?
(五)方案总结?
缓存空对象:可以解决某一个key频繁请求时产生的缓存穿透问题,使用简单,但是治标不治本。
布隆过滤器:采用redis位图原理,可以对多个key进行大概率的非法拦截,但是需要进行数据初始化并且不能删除,时效数据需要定时进行更新。
一般在实际项目中,都会同时使用这两种方案一起解决缓存穿透问题。本文的代码后面将在介绍完缓存雪崩,缓存击穿问题后一并上传到github上分享,代码仅做学习分享。