0


Redis 强化之二

缓存穿透

缓存穿透:先查询redis,如果redis中没有数据,就去查询数据库,数据库也没有(查询数据库不存在的数据)。

    正常业务下,一个请求查询到数据后,我们可以将这个数据保存在Redis之后的请求都可以直接从Redis查询,就不需要再连接数据库了

    但是一旦发生上面的穿透现象,仍然需要连接数据库,一旦连接数据库,项目的整体效率就会被影响

    如果有恶意的请求,高并发的访问数据库中不存在的数据,严重的,当前服务器可能出现宕机的情况

解决方案-------业界主流解决方案:布隆过滤器

布隆过滤器的使用步骤:

1.针对现有所有数据,生成布隆过滤器,保存在Redis中

2.在业务逻辑层,判断Redis之前先检查这个id是否在布隆过滤器中

3.如果布隆过滤器判断这个id不存在,直接返回(不会进行后面业务的处理)

4.如果布隆过滤器判断id存在,在进行后面业务执行


缓存击穿

一个计划在Redis保存的数据,业务查询,查询到的数据Redis中没有,但是数据库中有

这种情况要从数据库中查询后再保存到Redis,这个过程就是缓存击穿

但是这个情况不是异常情况,因为我们大多数数据都需要设置过期时间,而过期时间到时,这个数据就会从Redis中移除,再有请求查询这个数据,就一定会从数据库中再次同步

缓存击穿本身并不是灾难性的问题,也不是不允许发生的现象


缓存雪崩

同一时间发生少量击穿是正常的。但是如果出现同一时间大量击穿现象就是所谓缓存雪崩,指的就是Redis中保存的数据,短时间内有大量数据同时到期的情况

本应该由Redis反馈的信息,由于雪崩都去访问了Mysql,mysql承担不了,非常可能导致异常要想避免这种情况,就需要避免大量缓存同时失效

大量缓存同时失效的原因:通常是同时加载的数据设置了相同的有效期导致的

我们可以通过在设置有效期时添加一个随机数(在随机几毫秒的可能,cpu都可以做很多事,可能就从数据库查询到了失效数据并同步到redis),这样就能够防止大量数据同时失效了。


Redis存储原理

我们在编写java代码业务时,如果需要从多个元素的集合中寻找某个元素取出,或检查某个Key在不在的时候,推荐我们使用HashMap或HashSet,因为这种数据结构的查询效率最高,因为它内部使用了

"散列表"

有很多的槽位(一个槽位可以看成一个一个数组,数组长度越大,遍历的效率就会越低,多个槽位可以看成将一个长度比较长的数组分成多个较短的数组,遍历效率自然就高了)

槽位越多代表元素多的时候,查询性能越高,HashMap默认16个槽

Redis底层保存数据用的也是这样的散列表的结构

Redis将内存划分为16384个区域(类似hash槽)

将数据的key使用CRC16算法(HashMap使用的是hash算法)计算出一个值,取余16384

得到的结果是0~16383

这样Redis就能非常高效的查找元素了


Redis集群

Redis最小状态是一台服务器

这个服务器的运行状态,直接决定Redis是否可用

如果它离线了,整个项目就会无Redis可用

系统会面临崩溃

为了防止这种情况的发生,我们可以准备一台备用机

主从复制

也就是主机(master)工作时,安排一台备用机(slave)实时同步数据,万一主机宕机,我们可以切换到备机运行。

缺点:这样的方案,slave节点没有任何实质作用,只要master不宕机它就和没有一样,没有体现价值

读写分离

这样slave在master正常工作时也能分担Master的工作

但是如果master宕机,实际上主备机的切换,实际上还是需要人工介入,这还是需要时间的

那么如果想实现发生故障时自动切换,一定是有配置好的固定策略的

哨兵模式:故障自动切换

哨兵节点每隔固定时间向所有节点发送请求

如果正常响应认为该节点正常

如果没有响应,认为该节点出现问题,哨兵能自动切换主备机

如果主机master下线,自动切换到备机运行

但是如果哨兵判断节点状态时发生了误判,那么就会错误将master下线,降低整体运行性能

所以要减少哨兵误判的可能性

哨兵集群

我们可以将哨兵节点做成集群,由多个哨兵投票决定是否下线某一个节点

哨兵集群中,每个节点都会定时向master和slave发送ping请求

如果ping请求有2个(集群的半数节点)以上的哨兵节点没有收到正常响应,会认为该节点下线

当业务不断扩展,并发不断增高时

分片集群

只有一个节点支持写操作无法满足整体性能要求时,系统性能就会到达瓶颈

这时我们就要部署**多个支持写操作的节点,**进行分片,来提高程序整体性能

分片就是每个节点负责不同的区域

Redis0~16383号槽,

例如MasterA复制0~5000

MasterB复制5001~10000

MasterC复制10001~16383

一个key根据CRC16算法只能得到固定的结果,一定在指定的服务器上找到数据

有了这个集群结构,我们就能更加稳定和更加高效的处理业务请求了

为了节省哨兵服务器的成本,有些公司在Redis集群中直接添加哨兵功能,既master/slave节点完成数据读写任务的同时也都互相检测它们的健康状态

标签: redis 缓存 数据库

本文转载自: https://blog.csdn.net/qq_55112725/article/details/127281747
版权归原作者 �欢快↑㎡ 所有, 如有侵权,请联系我们删除。

“Redis 强化之二”的评论:

还没有评论