首页 > 数据库 > 关于Redis缓存,这3个问题一定要知道!
2021
01-11

关于Redis缓存,这3个问题一定要知道!

最近都没看Redis,现在回来温习下,现在从Redis的三大缓存开始重新探一探有多深有多浅(_^▽^_)

image

让我来开始知识的醍醐灌顶把!是时候表演真正的技术了。(哔哔哔哔....)

image

铁子们,看在这么卖力的份上,如果觉得本文对你有帮助的话,请动动你的小手,点个赞哟。

接下来就开始我们的Redis的三大缓存问题之旅,让我们坐上小飞船游一游这圣女峰。

image

在Redis缓存中有三个必须要知道概念:缓存穿透、缓存击穿和缓存雪崩。


缓存穿透

那什么是缓存穿透,它就是指当用户在查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存中没找到就会向数据库请求获取数据。它拿不到数据时,是会一直查询数据库,这样会对数据库的访问造成很大的压力。

如:用户查询一个 id = -1 的商品信息,一般数据库 id 值都是从 1 开始自增,很明显这条信息是不在数据库中,当没有信息返回时,会一直向数据库查询,给当前数据库的造成很大的访问压力。

这时候我们要想一想,该如何解决这个问题呢?o(╥﹏╥)o

一般我们可以想到从缓存开始出发,想如果我们给缓存设置一个如果当前数据库不存在的信息,把它缓存成一个空对象,返回给用户。

^_^没错,这是一个解决方案,也就是我们常说的缓存空对象(代码维护简单,但是效果不是很好)。

Redis 也为我们提供了一种解决方案,那就是布隆过滤器(代码维护比较复杂,效果挺好的)。


那接下来,先解释下这两种方案:

缓存空对象

那什么是缓存空对象呀!别急,缓存空对象它就是指一个请求发送过来,如果此时缓存中和数据库都不存在这个请求所要查询的相关信息,那么数据库就会返回一个空对象,并将这个空对象和请求关联起来存到缓存中,当下次还是这个请求过来的时候,这时缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。我们接下来可以看下面这个流程呀~

image

这时候,我们就会问了呀 ~,如果大量不存在的请求过来,那么这时候缓存岂不是会缓存许多空对象了吗~~~

没错哦!这也是使用缓存空对象会导致的一个问题:如果时间一长这样会导致缓存中存在大量空对象,这样不仅会占用许多的内存空间,还会浪费许多资源呀!。那这有没有什么可以解决的方法呢?我们来想一想:我们可以将这些对象在一段时间之后清理下不久可以了吗 ~

嗯嗯,没错!在想想 Redis 里是不是给我们提供了有关过期时间的命令呀(_^▽^_),这样我们可以在设置空对象的时间,顺便设置一个过期时间,就可以解决个问题了呀!


布隆过滤器

那布隆过滤器是不是不是一个过滤器,过滤东西的呀!哎呀,你太聪明了,没错它就是用来过滤东西的,它是一种基于概率的数据结构,主要使用爱判断当前某个元素是否在该集合中,运行速度快。我们也可以简单理解为是一个不怎么精确的 set 结构(set 具有去重的效果)。但是有个小问题是:当你使用它的 contains 方法去判断某个对象是否存在时,它可能会误判。也就是说布隆过滤器不是特别不精确,但是只要参数设置的合理,它的精确度可以控制的相对足够精确,只会有小小的误判概率(这是可以接受的呀 ~)。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。

这里有个典型的例子呀,来自钱大: