以前看到一本科幻小说,叫做《赡养上帝》,小说描述了一个非常开脑洞的故事,在未来的某一年,突然太阳系来了一艘飞船,他飞到地球的附近,在人们都在观望这个飞船里面是不是有外星人的时候,地球突然间不断的来了许多老头,这些老头穿着白色的袍子,慈眉善目,见到人就要一些吃的,后来人类的管理层将一些老头带到一个会议上问他们的来路,老头说,其实他们是高等级的文明,他们有高深的技术,然后老头说,如果人类愿意赡养他们,他们就将他们的技术给与人类,期初人类非常高兴,老头们也都住在了大部分人类的家中,可是好景不长,人类发现,老头们带来的技术太高深了,他们根本学不会,最终老头们都被赶了出去,为什么会这样呢,老头说,因为他们的科技高度发达,以至于很多底层的技术他们已经都不会了,他们太过于依赖计算机,后来他们自己都维护不了计算机了,老头们临走的时候和一个人类小孩要了一本书关于一元二次方程的书,老头说,他们要从最基础的开始学习。
技术就是这样,他会不断的迭代,数据库连接从jdbc到现在的mybatic,java从servlet,jsp到mvc,很多很多的技术都在原理底层,也许真的有一天,我们会忘记底层,但是底层才是最珍贵的,有人做了很多年技术,实际上不过是比别人多调用了几个api,用别人写好的东西,至于为什么这么写,又是一头雾水。
BB结束...
今天说Redis的缓存穿透,缓存击穿,缓存雪崩
1 缓存穿透
数据库在执行查询的时候,如果请求数量太多,那么他会有压力,因为他是基于硬盘的,有吞吐量的限制,为了减小数据库的压力,我们使用上了缓存,但是使用缓存也是有技巧的,比如,如果用户大量查询缓存中没有的数据,数据库也没有的数据怎么办,如果不做一些调整,缓存就不能缓解数据库的压力了,这种情况就是缓存穿透
解决方案:
1)缓存存空值:因为是查询没有的数据,那么可以将数据库中没有的数据也放入缓存,只不过他的value为空值
2)使用布隆过滤器:前面讲了布隆过滤器,这时候他就排上用场了,这东西对不存在他里面的数据判断是没有误差的,所以用他来处理很合适,唯独有点问题就是,他不支持删除,如果key被删除了,这样就有点麻烦。
2 缓存击穿
如果有一个key,他到达了失效时间,这时候他是一个热点数据,就会导致一大堆请求访问到数据库,数据库压力瞬间飞起。
解决方案
这里要用到setNx这个方法,这个方法前面也提到过,传入一个key value,如果key存在则啥也不干,如果不存在,则向redis中赋值,在缓存过期的时候执行这个方法就可以重新向redis中赋值,但是还有一个问题,就是不能同时赋值,要弄一个锁,否则多个线程还是会访问数据库,而这个锁就是redis的分布式锁,也就是互斥锁,同一时间setNx只能有一个线程在执行,其他的线程就要等待他执行
3 缓存雪崩
雪崩,听起来就是很厉害,他是在同一时间多个key过期,然后可怜的数据库又同时被多个查询折磨。
解决方案:
1)采用集群,减少服务宕机的概率
2)使用ehcache本地缓存+hystrix限流&&降级
ehcache能在服务挂掉之后,坚持一段时间
hystrix限流&&降级,可以限制访问量,比如3000个请求过来了,可以设置成只处理1000个,剩下的类2000个再走限流的逻辑。