黑客攻防,Redis缓存穿透 马士兵

redis是存放热门数据,就是mysql里面的部分数据,可以抵挡mysql的部分访问请求,就可以解决mysql性能的问题。

缓存穿透

低端黑客:利用redis里的数据,mysql里的部分数据,疯狂的向服务器发送 一个大量不存在的数据id,mysql里不存在,redis里肯定也是不存在的。这样就会增加mysql数据库的负担,最终导致崩溃。----------------缓存穿透

解决方法

将mysql里查询 出来的数据 缓存到redis中

正常黑客:向服务器发送大量的不重复的id,这些id都是负数,不存在的数据。会导致Redis内存数据库 紧张

解决方法

在redis和数据库之间添加一个过滤器,当客户端发送的id是mysql里不存在的id时,直接判断为非法请求

 

新的问题:当黑客不只是使用不存在的id,还使用不存在商品,日期去访问服务器,这样会导致redis里需要存储的mysql数据越来越来,怎么办?

过滤器:需要保存未来可能查询字段值

我们希望让过滤器变成轻量级,使用布隆算法

布隆算法:通过错误率来换取空间的一个算法,数据标识算法

 

hash函数,对id=10 的计算结果是1,也有可能计算id =100的数据,结果也是1,这就是hash碰撞

但是hash函数可能对id= 9的数据计算结果是3,说明这个数据是一定没有标识过

布隆算法的错误率:它告诉你数据存在,那么实际情况可能不存在(hash碰撞)

告诉你不存在,那么一定是不存在

 

错误率的大小是跟什么相关的呢?

1、数组的长度影响

2、hash函数的个数,比如下图设置了三个hash函数,计算出来三个不同的值,需要在数组上标识三个位置

 

缓存击穿

当redis里的数据设置了时间期限,比如为1天,1天过后数据就会被删除。

当redis里的1条数据期限为1天为热门数据的话,mysql在第二天就会收到大量的请求

怎么解决?

 分布式锁场景:

1.共享资源

2.共享资源互斥

3.多任务环境

 

 

在服务器与mysql之间设定一个锁,当多个请求过来的时候全部需要通过 锁,先获取锁,获取之后才能访问mysql,然后将mysql查询出来的数据放到redis中,后面的Tomcat服务器就可以在redis里查询数据了,就不用去获取锁了

 

缓存雪崩

 

大量的热数据在一天后被删除,缓存击穿只是一条热数据被删除,缓存雪崩就是多条数据在同一时间被删除

 

解决缓存雪崩:

有效期设置为随机时间,给出缓冲时间

redis 崩了: 设置集群 

题外话:

一致性hash算法,可以解决 集群动态扩展问题,解决疯狂内部复制问题

 

 

 

如何将一个redis数据 分配给多个redis呢?

 

一致性hash算法

上图的意思是:我们设置一个hash环,然后将我们的redis集群通过hash算法,映射到这个环上,这个环上大概有2的32次方个点构成。我们再将我们的value值,也映射到这个换上,注意:我们将数据顺时针存储,比如目前假设没有redis3,那么value1存储在redis1中,value2,value3存储在人redis2中。当我们增加一个redis之后,只需要在redis2和redis3之间将value3 传给redis3。

 

假设redis有10000台,那么增加一台redis之后,只需要更改2台的redis,其余9999台redis都不需要更改,这就是这个算法的牛逼之处

一致性hash算法的缺点:

数据倾斜:数据分配不规范,可能一个节点分配999999个数据,而另外一个redis只分配1个数据

解决数据倾斜:

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

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你在狗叫什么、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值