不如往深了说 引发了我对于追求探索技术本质的一些思考 平时在网上刷到不少关于redis的文章,我也在项目中常常用到redis这个缓存数据库 记得本身初学redis时 老是纠结技术若是去学 可是随着阅历以及学习能力和经验的提升 本身也对技术也有一些悟出来的道理 或者说是如何学好技术 日后有时间或者哪天心血来潮了写一篇关于本身对于技术的认知mysql
仍是进入主题,在网上常常刷到关于redis的文章,本身也常常在项目中用到redis,可是本身历来没有太过深究redis,内心老以为不得劲 因而今晚就心血来潮了写一篇关于本身对redis的一些思考redis
这里我就不说redis是干什么的了,若是不知道看下我以前写的redis文章,这些文章中也有官网的内容 由于我也是从官网学的)sql
如何理解缓存穿透呢?就是当请求访问过来时 先去查询redis缓存,若是缓存中没有, 再去查询mysql数据库, 而后mysql数据库返回数据到redis缓存中, redis接收数据并把数据存储起来, 这样当下次请求过来时,服务端就直接查询redis缓存了并返回给客户端,没必要再去查询mysql,缓解了数据库压力,并提升了效率
这是咱们的正常状况对不对!数据库
但但但但但但可是......有没有想过一个问题,若是是黑客恶意攻击,客户端发起的请求中的数据,咱们缓存中不只没有,就连咱们的mysql中也没有! 这下完犊子了 这下客户端只要重复的发送这个请求,全部的请求会通过redis后而后再来请求咱们的mysql,由于咱们数据库中没有呀,因此查询不到,也没有数据往redis中存),这就是缓存穿透缓存
那么若是是一个黑客恶意发起请求,mysql就有可能在长时间内持续承受大量的请求,mysql这时候内心很苦,很快就会撂挑子不干了,直接宕机,(接下来,整个系统宕机,而后你就抓紧删库跑路吧,(逃,学习
若是是大型项目的话,这个损失是很大的大数据
那咱们就要像羔羊同样任人宰割吗?NONONO,redis还有一个好兄弟,这个好兄弟叫做布隆过滤器blog
这个好兄弟能够存放大数据量,(偷偷告诉你,存放大数据量是他的优势,可是他也有缺点,就是查询到的结果不必定准确,0表明必定没有,1表明不必定有,布隆过滤器这位redis的好兄弟我这里就不介绍了,只介绍这位好兄弟如何仗义行侠帮助咱们的redis内存
在中间加了这位好兄弟,那么当请求进来后,会首先通过咱们的布隆过滤器,这个好兄弟先判断这个数据存不存在,若判断不存在直接丢弃请求,若这个数据存在再去进行redis查询,而后执行下一步,最后响应,有了这位好兄弟,咱们就能够讲数据库中全部的查询条件,放入布隆过滤器中,全部的请求先交给这位好兄弟来处理(这位好兄弟是有那么一点不靠谱,可是大致上并不影响效率
其实还有一种解决方案是把查询到的空值的key缓存起来并设置过时时间,可是会有一种弊端,就是如何发起大量的请求,那岂不是要接收多少空值的key,都要存在redis中,redis是内存数据库,内存不要钱吗?并且遭到恶意攻击,能有多大内存和黑客刚呢?
具体场景具体用法:
缓存雪崩能够这样理解,雪崩雪崩嘛!这些缓存就像雪同样发生了崩塌,缓存是存在于咱们的redis这位好兄弟这里的,这位好兄弟日常管理着这些缓存,加入哪一天这兄弟不高兴了,撒手不干了,宕机),那岂不是这些缓存数据又没了,当请求来临时又要mysql兄弟处理了,mysql兄弟看到这么些请求过来淦它,内心直发怵啊!简直是瑟瑟发抖,形成告终果就是数据库崩溃,系统崩溃 这就是咱们缓存雪崩,简单来讲redis宕机了
解决方案也很简单,简单粗暴,一个不行来俩甚至更多,一节更比六节强,搭建redis集群而后交给hystrix来监控
缓存击穿这个和缓存穿透字面上有点像,可是区别在于缓存穿透是数据中没有这个key,可是缓存击穿是数据中有这个key,而且咱们要把这个key缓存到redis中,
好比淘宝双11,并非全部的商品都要搞活动,只是一部分搞活动,那么这一部分商品在活动开始时,必然会有大量的用户去抢购,大量的请求),这时候若是咱们的数据在mysql中,mysql必然不干了,mysql这位兄弟内存又要骂娘了,那么咱们就须要redis来救场,提早把这些热点的key(须要搞活动的商品)缓存到redis中,当活动开始时直接去淦redis,没事redis扛得住,这样就解决了这个问题
但但但但但可是.......若是这个key忽然在用户还没抢购完的时候,很妈离谱就过时了!那么完犊子,mysql又要骂娘了
这就是缓存击穿(热点key过时问题)
解决方案: