缓存穿透、雪崩、击穿

缓存穿透

去缓存层没有命中数据,进而去mysql中查询数据。

低频的缓存穿透是无法并避免的,我们需要尽量避免高频的数据。

解决办法

1) 存储null值

将查询的结果为null的键存入redis中,这样下次找个键再来的时候就不用走mysql了,直接从redis返回。

问题:

  1. 若后期该键结果被其他线程所修改,可能会造成数据不一致的问题
  2. 若黑客采用UUID等形式不断地访问,不断无法抵抗缓存击穿问题,而且会在redis中生成大量null值的键,当内存不足,Redis启动LRU,LFU等置换策略,会替换掉原本正常的缓存,从而加剧问题。

2) 布隆过滤器

通过一定的错误率换取空间。通过bit数组来标识数据。映射一个值到布隆过滤器中,使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向的 bit 位置 1。由于存在hash碰撞,所以导致可能误判。

image.png

降低错误率的途径:

  1. 增加数组的长度
    但是会造成空间增大
  2. 增加Hash函数的个数
    若太多,那么数组将会很快填满,所以个数不是越多越好,需要参考数组的长度

Hash错误率:
若数据存在,那么实际可能不存在(发生hash碰撞)
若数据不存在,那么一定不存在(没标记过)

但是当删除数据时,可能会有问题,不能轻易的删除,这时可以考虑采用二维数组,没标1位进行计数,当计数位0是将该位置0。

缓存雪崩

缓存层中缓存的数据,再某一个时刻突然失效(无法访问)导致大量的请求打向mysql数据库。

产生原因:

  1. redis中缓存的数据有效性一直导致的
    解决:给每条数据加上一个随机有效期(不要突然同时失效)
  2. redis数据库挂掉了
    解决:分布式缓存

缓存击穿

一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

解决:
使用分布式锁来解决

  1. 基于mysql实现
    容易出现死锁,且效率不高
  2. 基于zookeeper实现
  3. 基于redis实现

Redis集群的Hash一致性算法

一致性Hash算法将整个Hash值控件组织成一个虚拟的圆环,对 2^{32}-1 取模。
将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置,这里假设将上文中四台服务器使用IP地址哈希后在环空间的位置如下:

image.png

将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器!

现假设Node C不幸宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器,如下图中NodeC与NodeB之间的数据,图中受影响的是ObjectC)之间数据,其它不会受到影响。

image.png

如果在系统中增加一台服务器Node X,如下图所示:

image.png

此时对象Object A、B、D不受影响,只有对象C需要重定位到新的Node X !一般的,在一致性Hash算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它数据也不会受到影响。

问题:
容易发生数据倾斜

image.png

解决:
一致性Hash算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器IP或主机名的后面增加编号来实现。
例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,于是形成六个虚拟节点:

image.png

同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“Node A#1”、“Node A#2”、“Node A#3”三个虚拟节点的数据均定位到Node A上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布,通俗点的原理如下图所示:

image.png

由于虚拟节点V1、V2映射到了真实节点N1,当数据object1确定到Hash环上的位置并找到虚拟节点V2的时候,其真实位置则是位于真实节点N1上。

参考文章:
https://blog.csdn.net/wlccomeon/article/details/86553831

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。