Redis的缓存穿透与缓存雪崩

缓存穿透
缓存一般是 Key-Value 方式存在,当某一个 Key 不存在时会查询数据库,假如这个 Key,一直不存在,则会频繁的请求数据库,对数据库造成访问压力。

主要解决方案:
对结果为空的数据也进行缓存,当此 Key 有数据后,清理缓存。
一定不存在的 Key,采用布隆过滤器,建立一个大的 Bitmap 中,查询时通过该 Bitmap 过滤。

布隆过滤器

有点类似于hashMap即通过hash后,在数组中找到对应的位置,只是布隆过滤器是一个位数组,即每个位置只有0和1两个值,通常用于大数据的去重,比如一个int类似四个字节,一个字节八位,那么就只用占用原来的1/32的空间

布隆过滤器实质上就是用二进制来表示一个数,比如我们有一个数组,数组内的元素分别是1,4,6,9,10
那我们找到最大的数10,用二进制表示就是1010,则初始化的布隆过滤器数组长度就是4,表示1时布隆过滤器数组里面的值就0001,表示6时布隆过滤器里面的值就是0110,其它的同理,这也是为什么布隆过滤器还可以用来排序的原因,当然布隆过滤器也优点类似于基数排序,感兴趣的可以自行百度.当然这种排序和数据状况有关,比如说我们上面最大的数是1000,那么我们就要初始化1000对应的二进制的数的长度的数组,但其中有很多空间我们是没有用到的,就会造成浪费.
其次布隆过滤器还有一点不同的是不只是通过一个hash函数进行哈希运行,而是通过K个hash函数
通过布隆过滤器来去重是有误差的,但也只是会发生好像见过你的错觉,即如果布隆过滤器里面存在,那么它就一点能判断出来,但是如果不存在,它也会有认为你存在的那种概率

缓存雪崩

Redis的缓存穿透与缓存雪崩_第1张图片
缓存雪崩.png

你可能感兴趣的:(Redis的缓存穿透与缓存雪崩)