Redis入门学习笔记(五)redis缓存击穿雪崩穿透

前言

由于以前的互联网不发达,用户使用不普及,所有没有并发的压力,不用担心数据库压力,所以大都直接使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题。

随着互联网的普及,高并发场景越来越多,例如双11活动,12306抢票等等。用户访问量非常庞大,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。

随着技术的进步和成熟,缓存这一概念逐渐被应用。这就是所谓的NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。

redis技术就是NoSQL技术中的一种,也是目前行业内缓存使用最多的。很多大型的项目都加入了缓存,这样可以大大缓解数据库的压力,提高响应速度和用户体验。但是Redis也有很多弊端,会出现各种各样的问题,例如有可能出现缓存穿透,缓存击穿,缓存雪崩等问题。

先来借助实际场景,来理解缓存击穿,雪崩,穿透的问题,以及如何解决这些问题。
例如用户需要查询某个商品(电视机)的库存数据,结构图如下
在这里插入图片描述

二.缓存击穿

举例
例如在双11抢购中,某个电视机是爆款被很多人抢购,那么这个时候电视机的库存这个key就一直抗着高并发,那么如果这个key突然失效了,数以亿计的并发请求就进入到数据库了,缓存就被击穿了。

解决方案

  • 在设置Redis键的过期时间时,加上一个随机数,这样可以避免大量的缓存在同一时间过期。
  • 加锁排队,对这种场景进行加锁排队,从而实现限流降低系统压力。

三.缓存雪崩

举例

例如大量的缓存在同一时间过期了,或者缓存服务器由于某种原因宕机了,这个时候有很多用户请求,例如双11整点抢购,这些用户就会直接查询数据库,这一瞬间,数据库的压力就会崩溃,数据库服务器就会宕机。

解决方案

  • 在设置Redis键的过期时间时,加上一个随机数,这样可以避免大量的缓存在同一时间过期。
  • 部署分布式的Redis服务,当主服务挂了之后马上启动备用服务,提高系统可用性。
  • 加锁排队,对这种场景进行加锁排队,从而实现限流降低系统压力。

四.缓存穿透

举例

扫描二维码关注公众号,回复: 10570840 查看本文章

A用户现在要查询电视机的库存,先去缓存里面查询,发现缓存里面没有电视机的数据,就去数据库里面查询,发现数据库里面也没有。假如有100个用户,1万个用户甚至更多的用户去查询电视机,想一想这对数据库是多么大的压力,试想一下如果有人借助这个漏洞恶意攻击,数据库是不是就崩溃了。这就是我们所说的缓存穿透。

解决方案

  • 缓存空对象:无论数据库中有没有电视机的数据,都会缓存下来,这样无论多少人去查电视机,都有缓存数据。说白了就是用户每次查询,结果都会缓存,不管数据库中有没有这个数据。这样做的弊端就是系统资源开销会比较大,可以设置缓存的过期时间来减小开销。
  • 布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。提前过滤掉不合法的请求

五.小结

其实Redis在缓存中遇到的问题远不止这些,只是在高并发场景下,这些问题在互联网环境下显得尤为重要,特别是电商行业。所以在数据缓存这块需要结合实际情况来设计,重点注意几个问题,一个是key的过期时间问题,还有就是加锁,在核心业务地方加锁,降低并发,最后就是分布式部署redis服务,一台服务挂了,马上启动另外一台,大大提高系统的可用性。

发布了82 篇原创文章 · 获赞 46 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/u013254183/article/details/105368374