关于redis缓存数据库的一些思考

今晚无聊,躺在床上,在刷技术文章时,看见了一篇关于redis缓存的文章 写的蛮好,这也就引发了我对于redis思考!

不如往深了说 引发了我对于追求探索技术本质的一些思考 平时在网上刷到不少关于redis的文章,我也在项目中常常用到redis这个缓存数据库 记得本身初学redis时 老是纠结技术若是去学 可是随着阅历以及学习能力和经验的提升 本身也对技术也有一些悟出来的道理 或者说是如何学好技术 日后有时间或者哪天心血来潮了写一篇关于本身对于技术的认知mysql

仍是进入主题,在网上常常刷到关于redis的文章,本身也常常在项目中用到redis,可是本身历来没有太过深究redis,内心老以为不得劲 因而今晚就心血来潮了写一篇关于本身对redis的一些思考redis

这里我就不说redis是干什么的了,若是不知道看下我以前写的redis文章,这些文章中也有官网的内容 由于我也是从官网学的)sql

1.聊聊redis缓存穿透问题

如何理解缓存穿透呢?就是当请求访问过来时 先去查询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是内存数据库,内存不要钱吗?并且遭到恶意攻击,能有多大内存和黑客刚呢?

具体场景具体用法:

  1. 若是空值的key少能够考虑缓存起来
  2. 若是空值的key多而且不重复,仍是让布隆过滤器这位好兄弟来拔刀相助比较好

2.聊聊redis缓存雪崩问题

缓存雪崩能够这样理解,雪崩雪崩嘛!这些缓存就像雪同样发生了崩塌,缓存是存在于咱们的redis这位好兄弟这里的,这位好兄弟日常管理着这些缓存,加入哪一天这兄弟不高兴了,撒手不干了,宕机),那岂不是这些缓存数据又没了,当请求来临时又要mysql兄弟处理了,mysql兄弟看到这么些请求过来淦它,内心直发怵啊!简直是瑟瑟发抖,形成告终果就是数据库崩溃,系统崩溃 这就是咱们缓存雪崩,简单来讲redis宕机了
缓存雪崩问题
解决方案也很简单,简单粗暴,一个不行来俩甚至更多,一节更比六节强,搭建redis集群而后交给hystrix来监控

集群

3.聊聊缓存击穿问题

缓存击穿这个和缓存穿透字面上有点像,可是区别在于缓存穿透是数据中没有这个key,可是缓存击穿是数据中有这个key,而且咱们要把这个key缓存到redis中,

好比淘宝双11,并非全部的商品都要搞活动,只是一部分搞活动,那么这一部分商品在活动开始时,必然会有大量的用户去抢购,大量的请求),这时候若是咱们的数据在mysql中,mysql必然不干了,mysql这位兄弟内存又要骂娘了,那么咱们就须要redis来救场,提早把这些热点的key(须要搞活动的商品)缓存到redis中,当活动开始时直接去淦redis,没事redis扛得住,这样就解决了这个问题

但但但但但可是.......若是这个key忽然在用户还没抢购完的时候,很妈离谱就过时了!那么完犊子,mysql又要骂娘了

这就是缓存击穿(热点key过时问题)

解决方案:

  1. 热点key居然要妈离谱过时,咱们在设置热点key时让这个bi永不过时就完事了,简单粗暴
  2. 互斥锁,当第一个查询数据库的请求发起时,给缓存中这个数据上锁,其余请求这个key等待,当第一个查询数据库打请求完成后解锁,其余请求直接从缓存中查
相关文章
相关标签/搜索