什么是redis缓存穿透, 缓存雪崩, 缓存击穿
什么是redis?
redis是一个非关系型数据库,相对于其他数据库而言,它的查询速度极快,且能承受的瞬时并发量非常的高。所以常常被用来存放网站的缓存,以减少主要数据库(如mysql)的服务器压力。
当我们要用redis作为缓存的时候, 有一些常见的经典问题我们就必须要有所考虑和防范。这里我主要介绍一下缓存穿透、缓存雪崩和缓存击穿的现象发生的原因和防范措施。
缓存穿透
当我们用redis作缓存时, 其初始目的是为了在我们访问某一个网页或者商品时将此次从数据库查询得到的数据存放到redis中,这样下次再次访问时就直接去redis中取数据,减小数据库的压力。但是如果说我们要查询的数据不在数据库中的时候我们自然就无法取到它,更别说存到redis中了。这样重点就来了, 有的黑客就利用这一点写一个脚本高并发量的发问这个不存在的数据,造成数据库的高频率的查询访问最终导致你的数据库崩溃。
那么如何去防范这个问题呢?
解决方案: 就是当有一个查询为空的请求过来, 我们也将这个请求查询的key存放到redis并设置空值, 这样再次访问时就不会去我们的数据库了, 我一般设置其过期时间较短,这样防止数据更新后无法同步到缓存。
缓存雪崩
缓存雪崩就是我们的缓存是在同一时间创建(如天猫双十一),然后设置的缓存时间是一置的, 这样到特定的时间就会出现缓存雪崩的情况, 此时若是有当访问量的操作就会造成数据库服务器的压力过大。
解决方案: 我就拿电商的项目来举例吧, 我们针对不同分类的商品设置的缓存过期时间不同,然后对统一分类的商品设置(一定范围内的)随机的过期时间,这样就十分巧妙地避免了缓存的集中消失过期,在做的时候尽量注意一些细节,比如说热门商品的缓存时间可以适当长一些,而冷门商品的过期时间短一些,这样可以尽量的减少缓存服务器的压力。
缓存击穿
缓存击穿就是假设我们有一件特别火爆的热门商品, 它每天都有大量的客户访问, 但是既然是缓存就有过期的那一刻,所以在缓存过期的那一刻, 大量的访问就落到了数据库的头上,这样就造成了我们的缓存击穿。(一般能达到这种情况的电商不多, 哈哈,防患于未然嘛)
解决方案:我们将主打商品就是大概率会成为爆款的商品缓存时间设置为永不过期,这样就不会造成数据库的压力了, 反言之就要牺牲缓存服务器的压力了。
以上就是我想要说的这三个问题。