Redis缓存穿透解决方案和原理-懵懂小白成神之路

Redis缓存穿透解决方案和原理

采取逐渐引入方式,带你get到柳暗花明又一村的feeling。冲冲冲!!!

1.Redis缓存:将Redis作为内存,作为业务查询与数据库之间的缓存,注意; Redis在内存,数据库在外存。
2.Redis数据缓存:执行一条查询语句,在Redis中存在(当然在数据库中也必定存在,Redis和数据库中的数据遵循一致性原则,Redis中数据是数据库中数据的子集),就直接从Redis中取出返回,减少对I/O的访问,提升查询效率。
3.缓存不存在,数据库存在:要查询的数据在Redis中没有,在数据库中有,因此查询要“穿过”Redis到外存的数据库取出数据返回,也就是不经过Redis取数据返回。那么问题来了:什么时候Redis中没有要查询的数据呢?答案是过期和新增过期:在Redis会有一个key值,每个key值都有一个ttl,也就是生命周期,一旦过期了就只能存在数据库里了;新增:插入,更新的数据还未来得及同步到Redis中。
4.如果线程查询一个数据库中不存在的值,此时从数据库中就返回一个空值。当一个线程不断执行同一条查询语句查询这个Redis和数据库都不存在的数据时,比如说执行上万次同一条查询语句,那么每次都穿过Redis,这样Redis就没有意义了。那么为了解决这个问题,就可以在Redis中设置空值,同一条查询语句对应的key(数据库中没有的值)都对应着一个空值,当查询其他查询语句也查询数据库中不存在的值时,都要对每个key设置一个空值,随着越来越多这样的key,Redis服务器就会承受不了这么大的压力,例如下面的例子就引出了Redis缓存穿透
5.Redis缓存穿透:Redis和数据库都不存在。当不断请求数据库中不存在的不同的的值,这就使得Redis没有意义了,因为这么多的查询都“穿过”Redis。那么我们应该怎么解决呢?
基于一种思路设计数据结构和算法:
1.数据变长且量多
2.分散排布

对于思路中第一点:
在这里插入图片描述

数组可扩容,同时将数据的表现形式转化为二进制01(0表示不存在,1表示存在),对于计算机来说,01方便计算转化控制,提高效率,对于内存来说,01比直接存数据占用更少内存。

对于思路中第二点:
Hash函数有分散排布这种特性。

因此,我们将数据通过hash计算得到位图中对应的index,将0改为1,就视作元素在数据库中存在。
但由于hash函数本身的缺陷,会造成一定问题,如下:
在这里插入图片描述

减少hash冲突的方法:1.扩容数组(耗费空间) 2.多次计算hash值(耗费时间,即使是并行运算)
下面是采取多次计算hash值的方法在这里插入图片描述

因此要优化这种结构,就必须想办法达到数组扩容量和hash计算次数相对平衡。这就引出了布隆过滤器(数据结构+算法,一定容量的数组加上多次hash计算)。

下面我们来看布隆过滤器的一个例子:n为hash函数计算次数
在这里插入图片描述

布隆过滤器的特性(从两个角度分析):
角度1:

如果布隆过滤器判断元素在集合中存在,那么就不一定存在(假阳性)。

原因:不同元素能够得到相同的index:有可能三次hash计算都能够得到与位图中对应Redis里面的值为1的,然后返回true。

如果布隆过滤器判断元素在集合中不存在,那么就一定不存在(利用这个特性解决Redis缓存穿透问题:如果布隆过滤器判断不存在,就不用到数据库中取,更不用到Redis中去取了;同时我们也get到一个点:位图中数据与数据库中数据一一对应)。

原因:同一个元素通过hash函数计算得到的index一定是相同的,如果元素存在,对应index里面的值一定全为1。
角度2:

如果元素实际存在,布隆过滤器一定判断存在。

如果元素实际不存在,布隆过滤器可能定判断存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fire king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值