缓存穿透及布隆算法

引言

大概介绍一下什么是缓存穿透、缓存击穿以及布隆过滤器相关功能和算法
看下面一张图:

image.png

客户端发送请求到服务器,然后最终访问数据库这是一个简单的流程,但为了能够节省资源,避免频繁连接和关闭,我们在服务器和数据库之间建立个数据源,其实它就是个池子一样的东西,需要的话我们去池子里面拿,不需要或者用完了就放进去,中间节省了连接和关闭的时间。但是这远远不够~~~

image.png

数据量一大我们得做一些其他措施,如分库分表、主从复制、读写分离等,或者是mysql集群

image.png

再来个中间件也未尝不可,redis和memached作为缓存使用,从而降低我们服务器压力
哦豁,终于扯到我们这样这章的重点了,对redis
加入缓存这一层虽有效降低了数据库的压力,但是又会引入其他种种问题,我们来看下:

缓存穿透

redis中有数据,但是用户(牛逼用户)访问的时候是绕过redis的缓存直接访问数据库,比如访问id=-1的某个数据在redis中没有,在mysql中也没有,这时候他搞个JMeter怼个并发直接访问不存在的数据,我数据库岂不凉凉?这个就是我们所说的缓存穿透 后面所说的缓存击穿和缓存雪崩其实是缓存穿透的特殊表现
解决方案:

  • 在Redis中增加key为这个id值为null的键值对,下次访问的时候就直接从redis中拿

缺点:这样就造成的redis中会有大量value为null的脏数据,如果恶意攻击这样肯定也是不行的

  • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;

缺点:做法比较单一

缓存击穿

redis中没有数据(大量过期),数据库中有。这个时候在高并发情况下用户请求数据直接从mysql中取形成缓存击穿,但是一般公司不需要解决,因为并发量不高
解决方案:

  • 热点数据设置永不过期
  • 分布式锁:虽然效率底,但是很有效的保证你数据库的安全(不常用 )

缓存雪崩

存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
和缓存击穿不同的是:缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
原因:

  1. redis中缓存的数据有效期一致导致的
  2. redis数据库down掉了

解决方案:

  1. 不同的key设置随机的过期时间,避免过期时间一致或者设置热点数据永不过期
  2. 分布式部署时将热点数据分布在不同的缓存数据库中(分布式缓存)
    1. 切片集群模式(不同的redis数据库中存放不等的热点数据)
    2. 副本集群模式(不同的redis数据库中存放相同的热点数据)

布隆过滤器

image.png

布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难,所以它不适合于低错误率的场景,因为他本身就是靠错误率来换取空间利用率的。
布隆过滤器广泛应用于网页黑名单系统、垃圾邮件过滤系统、爬虫网址判重系统等

布隆算法

布隆算法可以通过一定的错误率换取空间,底层是通过bit数组表示数据,而bit数组占用内容是非常少的
所以一方面也就解决的布隆过滤器内存紧张问题(筛选条件过多),而bit数组的数据其实就是通过给定的key进行Hash算法计算的Hash值 那么这个bit数组就必要保证两个条件:

  1. hash值范围[0,length-1]
  2. 计算出来的hash值是足够散列

那么布隆算法的错误率是怎么产生的呢?对就是hash碰撞而来的,那么如何降低错误率呢?

  1. 增加bit数组的长度
  2. 增加hash函数的个数(一个key计算多次hash值,放在bit数组中)如下图:

image.png

原理介绍:给定一个key通过三个hash函数来计算这个key的hash值,hash就是对应bit数组的下标,那么这三个bit值为1才表示这个key存在,如果待检测的时候元素key经过这三个hash函数生成的值对应的下标位置上不全是1,name这个key一定不存在这个集合,反之这个key可能存在于这个集合中
但是,hash函数的个数并不是越多于好,需要参考数组的长度,尽量满足平均分布,这样既降低误判发生的概率,又可以充分利用bit数组的空间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值