缓存穿透、缓存击穿、缓存雪崩

1、背景

在高并发环境下,用户长时间对服务器进行操作,可能会出现缓存穿透、缓存击穿、缓存雪崩等问题。

2、缓存穿透

2.1 什么是缓存穿透?

高并发前提下,用户访问数据库缓存都不存在的数据称之为缓存穿透。
缓存之所以存在,除了提高程序运行效率,还有就是保护数据库。如果有大量的请求访问数据库跟缓存都没有的数据,那么此时缓存便会失效,这大量的请求必然会直接访问数据库。
缓存穿透、缓存击穿、缓存雪崩_第1张图片

2.2 缓存穿透的解决方案

①禁用IP,限制IP的使用(因为访问不存在的数据基本上属于恶意访问)
②限流,每秒最多访问3次
③使用布隆过滤器

2.3 布隆过滤器

2.3.1 介绍

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

2.3.2 原理

①首先对数据进行预加载。将数据进行hash计算得出的hash值进行特定的函数运算出数组的索引,然后在该坐标位置用二进制向量1表示。如此一来坐标为0的数据一定不存在,所以可以禁止访问,而坐标为1可能存在,可以放行访问。
②当一个请求过来了,通过hash加特定的函数算法然后查看数组的二进制的值来判断是否允许通过。
③由于是采用二进制向量存储,所以节省大量内存空间。
缓存穿透、缓存击穿、缓存雪崩_第2张图片

2.3.4 hash碰撞问题

如果坐标值是0,那就一定不存在,但是坐标是1也不代表一定存在,因为两个不同的key计算的结果是可能是相同的坐标值,那么如何解决这个问题呢?

2.3.4.1 解决hash碰撞问题

要解决hash碰撞的问题,那就要降低hash碰撞的概率。
①通过增长数据的个数,来降低坐标值相同的概率。
②通过采用多种hash函数来计算坐标值,因为不同的hash函数计算出的坐标值结果会有不同,只有正在存在的数据无论通过哪种hash函数计算,坐标值都是向量1,但凡有一个结果不是1,就可以断定这个是不存在的数据。
缓存穿透、缓存击穿、缓存雪崩_第3张图片

3、缓存击穿

3.1 什么是缓存击穿?

某个热点数据在缓存中突然失效。导致大量的用户直接访问数据库。导致并发压力过高造成异常的现象。
缓存穿透、缓存击穿、缓存雪崩_第4张图片

3.2 缓存击穿的解决方案

之所以存在缓存击穿主要是因为数据被设置了超时时间,当超时时间一到便会被删除,而此时刚好处于高并发。
①尽可能将热点数据的超时时间,设定的长一点。
②设定多级缓存,超时时间采用随机算法。只要不同时失效便可以有效阻止这种现象。
缓存穿透、缓存击穿、缓存雪崩_第5张图片

4、缓存雪崩

4.1 什么是缓存雪崩?

在缓存服务器中,由于大量的缓存数据失效,导致用户访问的命中率过低。导致直接访问数据库。fluashAll命令和数据大量数据同时超时可能导致缓存雪崩现象。

4.2 缓存雪崩的解决方案

①设定超时时间时,应该采用随机算法
②设定多级缓存
缓存穿透、缓存击穿、缓存雪崩_第6张图片

你可能感兴趣的:(缓存设计,redis,缓存命中率,高并发)