缓存击穿
一般就是指缓存时间过期了或者压根就没有这些数据,当并发量特别大的时候,在缓存中没读到数据,跑到数据库读取数据,给数据库造成压力
解决 :1、设置热点数据永不过期
/2、 加互斥锁
缓存雪崩
缓存中大量数据过期,导致数据库崩溃。和缓存击穿不同的是缓存击穿指并发同一条数据,雪崩是指好多数据都过期了
解决方法
1、设置热点数据永不过期
2、设置时间过期时间随机,防止大量数据同时过期
3、分布式集群,数据均匀分配到每一个缓存结点中
缓存穿透
主要原因是黑客攻击,知道大量的key值根本不存在缓存中 ,然后高并发的去访问导致数据库压力过大,导致数据库宕机
攻击策略:针对冷门数据不断访问,或者访问数据库压根不存在的数据,但是单条数据很难奏效,因为redis会缓存访问量高的数据,redis不缓存,mybatis的一二级缓存也会缓存起来。所以需要不断切换冷门数据
防御策略:redis缓存,mybatis缓存也会把他们缓存起来
解决方案
1、参数校验,在后端设置用户id不小于0,手机号格式、邮箱格式、验证码等等
2、布隆过滤器
布隆过滤器
数据来的时候,布隆过滤器只需要校验这个数据是否存在。不会存到布隆过滤器中,而是把全量数据的特征存进去。
那么什么可以作为特征呢?设计N个hash函数,把数据通过hash函数转化成hash值,也就是数字
那么我们可以假设用int数组来记录这些。一个int类型的数组如果全部存满了数据,也就是16GB,那么用一个bit数组来存储的话,需要的就是16GB/32 = 512MB
如果布隆过滤器说这个值不存在,那么一定不存在,
说这个值存在,那么可能不存在
布隆过滤器可以判断哪些数据肯定不存在,通过位图操作进行散列hash,不能判断哪些数据有,但是能判断哪些数据不存在
很多人想到的是HashMap。
确实可以将值映射到 HashMap 的 Key,然后可以在 O(1) 的时间复杂度内返回结果,效率奇高。但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。
通过哈希函数计算出余数然后放到把对应位置的0改成1,但是可能存在一定为误判率。产生的原因是由于哈希碰撞导致的巧合而将不同的元素存储在相同的比特位上。
应用场景:
网页爬虫对 URL 去重,避免爬取相同的 URL 地址; 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱; Google Chrome 使用布隆过滤器识别恶意 URL; Medium 使用布隆过滤器避免推荐给用户已经读过的文章; Google BigTable,Apache HBbase 和 Apache Cassandra 使用布隆过滤器减少对不存在的行和列的查找。