一文拿捏分布式、分布式缓存及其问题解决

news2025/1/12 6:09:15

1.分布式

1.集中式

传统的计算模型通常是集中式的,所有的计算任务和数据处理都由单一的计算机或服务器完成。然而,随着数据量和计算需求的增加,集中式系统可能会面临性能瓶颈和可靠性问题。

故而引出了分布式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

2.分布式

分布式是一种利用多台计算机协同工作来完成任务的计算模型

分布式系统的目标是通过将任务和数据分割成小块,将计算任务分发到不同的计算节点上,充分利用多台计算机的处理能力,以应对大规模的计算需求,以提高性能、可扩展性和容错性。

分布式系统的一些问题:数据一致性、通信延迟、故障处理等。为了解决这些问题,需要使用各种技术和算法,如分布式数据库、消息队列、负载均衡、分布式存储等。

2.分布式缓存

例如:redis缓存

分布式缓存是用于存储和管理数据以提高性能和响应速度的一种技术。

通常用于加速应用程序的数据访问,减轻后端数据库或其他数据存储系统的负载。

在分布式缓存中,数据被存储在位于应用程序和数据存储系统之间的一个或多个缓存节点中。这些节点可以位于不同的服务器或计算机上,形成一个分布式的缓存网络。当应用程序需要访问数据时,它首先会查询缓存,如果缓存中存在数据,就可以快速获取而不必访问原始数据存储系统

需要注意的问题:

  1. 缓存穿透

  2. 缓存击穿

  3. 缓存雪崩

  4. 数据一致性

1.缓存穿透

指查询一个数据库中一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录

解决方案:

1.缓存null

当数据库中查不到数据的时候,缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,这样下次再查询该数据的时候,就可以直接从缓存中拿到,从而达到了减小数据库压力的目的

存在缺点:

  1. 需要缓存层提供更多的内存空间来缓存这些空对象,当这种空对象很多的时候,就会浪费更多的内存;

  2. 会导致缓存层和存储层的数据不一致,即使在缓存空对象时给它设置了一个很短的过期时间,那也会导致这一段时间内的数据不一致问题。

2.使用布隆过滤器

布隆过滤器:

布隆过滤器,就是一种数据结构,它是由一个长度为m bit的位数组与n个hash函数组成的数据结构,位数组中每个元素的初始值都是0。在初始化布隆过滤器时,会先将所有key进行n次hash运算,这样就可以得到n个位置,然后将这n个位置上的元素改为1。这样,就相当于把所有的key保存到了布隆过滤器中了。

布隆过滤器就相当于一个位于客户端与缓存层中间的拦截器一样,负责判断key是否在集合中存在

存在缺点:

有误判的可能(位数组长度越大,误判率越低): 例如:

有三个key,经hash运算后

key1: 1 、2 、4

key2: 2 、5 、6

key3: 4、 5 、6 由于4、5、6都以存在已置为1,布隆过滤器就认为key3在库中存在

2.缓存击穿

对于设置了过期时间的key(一个key),缓存在某个时间点过期了,在该热点数据重新载入缓存之前,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。

解决方案:

1.永远不过期
  1. 不对这个key设置过期时间

  2. 正常给key设置过期时间,同时在后台同时启一个定时任务去定时地更新这个缓存

2.使用分布式锁

同一时刻只能有一个查询请求重新加载热点数据到缓存中。

这样,其他的线程只需等待该线程运行完毕,即可重新从Redis中获取数据

整体的思想:获取锁的时候向Redis中插入数据,释放锁的时候从Redis中删除数据。

使用的命令: setnx

详细往下看↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

3.缓存雪崩

当缓存中有大量的key在同一时刻过期,或者Redis直接宕机了,导致大量的查询请求全部到达数据库,造成数据库查询压力骤增,甚至直接挂掉

解决方案:

1.添加过期随机数,使key均匀失效

将key的过期时间后面加上一个随机数,这个随机数值的范围可以根据自己的业务情况自行设定,这样可以让key均匀的失效,避免大批量的同时失效。

4.数据一致性问题

因为数据库与缓存是不同的组件,操作必须有先后顺序,无法像数据库的事务一样满足ACID的特性,所以就会出现数据在缓存中与在数据

库中不一致的问题。

在更新的时候,操作缓存和数据库无疑就是以下四种可能之一:

1.双写模式:

  • 先更新缓存,再更新数据库

  • 先更新数据库,再更新缓存

2.失效模式:

  • 先删除缓存,再更新数据库

  • 先更新数据库,再删除缓存

1.先更新缓存,在更新数据库

如果我成功更新了缓存,但是在执行更新数据库的那一步,服务器突然宕机了,那么此时,我的缓存中是最新的数据,而数据库中是旧的数据。

2.先更新数据库,在更新缓存

如果我成功更新了数据库,但是在执行更新缓存的那一步,服务器突然宕机了,那么此时,我的缓存中就是老数据,而数据库中是新的数据。

3.先删除缓存,在更新数据库
非高并发情况下可保证数据一致性:

若删除缓存成功,更新数据库失败,下次操作会去数据库中获取该数据,并将最新数据写入缓存

读写发情况下会出现数据不一致问题:

4.先更新数据库,在删除缓存
1.更新数据库成功了,而删除缓存失败

数据库中就会是新数据,而缓存中是旧数据,数据就出现了不一致情况:

2.更新数据库成功了,删除缓存也执行成功

还是会造成数据的不一致性

但是此处达成这个数据不一致性的条件明显会比起其他的方式更为困难

  • 时刻1:读请求的时候,缓存正好过期

  • 时刻2:读请求在写请求更新数据库之前查询数据库,

  • 时刻3:写请求,在更新数据库之后,要在读请求成功写入缓存前,先执行删除缓存操作。

这通常是很难做到的,因为在真正的并发开发中,更新数据库是需要加锁的,不然没一点安全性

5.延迟双删

先进行缓存清除,在更新数据库,最后(延迟N秒确保数据库已更新)再执行缓存清除。进行两次删除,且中间需要延迟一段时间

上述方案在极端情况下,如果第三步删除失败仍然可能导致数据一致性问题,解决方案有:

⭐⭐⭐⭐⭐引入MQ重试机制,基于数据库binlog的方式增量解析、订阅和消费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文拿捏基于redis的分布式锁、lua、分布式性能提升

1.分布式锁 jdk的锁: 1、显示锁:Lock 2、隐式锁:synchronized 使用jdk锁保证线程的安全性要求:要求多个线程必须运行在同一个jvm中 但现在的系统基本都是分布式部署的,一个应用会被部署到多台服务器上,s…

40 二叉树的直径

二叉树的直径 总结:两个节点之间最长路径 路径的结点数 - 1题解1 递归——DFS 给你一棵二叉树的根节点,返回该树的 直径。 二叉树的直径是指树中任意两个节点之间最长路径的长度。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的长度由…

Python无废话-基础知识字典Dictionary详讲

“字典Dictionary” 是一种无序、可变且可嵌套的数据类型,用于存储键值对。字典使用花括号{}来定义,并用逗号分隔键值对。本文对字典常使用方法,创建字典、添加字典、删除字典、如何获取字典做了知识归纳。 字典有以下几个特征: …

92、Redis ------- 使用 Lettuce 操作 Redis 的方法和步骤----(文字讲解无代码)

lettuce :英语的意思:生菜 是一个用来操作redis的框架,springboot内置默认支持的也是 lettuce ,也可以自己改成 jedis Jedis 也是一个用来操作redis的框架 ★ Lettuce的核心API RedisURI:用于封装Redis服务器的URI信息…

家用无线路由器如何用网线桥接解决有些房间无线信号覆盖不好的问题(低成本)

环境 光猫ZXHN F6600U 水星MW325R 无线百兆路由器 100M宽带,2.4G无线网络 苹果手机 安卓平板电脑 三室一厅94平 问题描述 家用无线路由器如何用网线桥接解决有些房间无线信号不好问题低成本解决,无线覆盖和漫游 主路由器用的运营商的光猫自带无…

cf 解题报告 01

E. Power of Points Problem - 1857E - Codeforces 题意: 给你 n n n 个点,其整数坐标为 x 1 , … x n x_1,\dots x_n x1​,…xn​,它们位于一条数线上。 对于某个整数 s s s,我们构建线段[ s , x 1 s,x_1 s,x1​], [ s , x…

【Java】super 关键字用法

目录 this与super区别 1.访问成员变量-示例代码 继承中构造方法的访问特点 2.访问构造方法-示例代码: 继承中成员方法访问特点 3.访问成员方法-示例代码: super 关键字的用法和 this 关键字相似 this : 代表本类对象的引用super : 代表父类存储空间…

VBA技术资料MF64:遍历单元格搜索字符并高亮显示

【分享成果,随喜正能量】不要在乎他人的评论,不必理论与他人有关的是非,你只要做好自己就够了。苔花如米小,也学牡丹开。无论什么时候,都要有忠于自己的勇气,去做喜欢的事,去认识喜欢的人&#…

JUC中的设计模式

文章目录 1. 终止模式之两阶段终止模式 1. 终止模式之两阶段终止模式 需求:用一个线程每两秒检测***状态,当不想检测时,用另一个线程将其停止 在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个料理后事…

JVM相关概念

JVM,全程Java Virtual Machine,是java虚拟机的意思! 是一个类似计算机的存在,是在计算机上模拟真实计算机运行的平台,它代替Java代码和各种计算机设备之间的交互! Java程序把代码翻译成字节码交给虚拟机&a…

借助Log360实现综合可见性的增强网络安全

当今的企业对技术的依赖程度前所未有,因此强大的威胁检测和响应策略变得至关重要。在现代世界中,网络犯罪分子不断寻找新的、富有创意的方式,以侵入组织的网络并窃取敏感数据。综合性的可见性是一个关键要素,有时被忽视&#xff0…

23-properties文件和xml文件以及dom4j的基本使用操作

特殊文件 我们利用这些特殊文件来存放我们 java 中的数据信息,当数据量比较大的时候,我们可以利用这个文件对数据进行快速的赋值 对于多个用户数据的存储的时候我们要用这个XML来进行存储 关于这些特殊文件,我们主要学什么 了解他们的特点&…

Linux系统编程基础:进程控制

文章目录 一.子进程的创建操作系统内核视角下的父子进程存在形式验证子进程对父进程数据的写时拷贝 二.进程等待进程非阻塞等待示例: 三.进程替换内核视角下的进程替换过程:综合利用进程控制系统接口实现简单的shell进程 进程控制主要分为三个方面,分别是:子进程的创建,进程等待…

windows修改键位F11变insert(改键盘映射)

这里是通过改变windows的注册表来实现的 1.按住winr打开运行,在运行中输入“regedit”,再点击“确定”按钮。如下图 2.找到注册表的目录 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout 3.在Keyboard Layout右击新建 -> 二进…

18scala笔记

Scala2.12 视频地址 1 入门 1.1 发展历史 … 1.2 Scala 和 Java Scala Java 编写代码使用scalac编译成.class字节码文件scala .class文件 执行代码 1.3 特点 1.4 安装 视频地址 注意配置好环境变量 简单代码 1.5 编译文件 编译scala文件会产生两个.class文件 使用java…

OpenGLES:绘制一个颜色渐变、旋转的3D立方体

一.概述 之前关于OpenGLES实战开发的博文,不论是实现相机滤镜还是绘制图形,都是在2D纬度 这篇博文开始,将会使用OpenGLES进入3D世界 本篇博文会实现一个颜色渐变、旋转的3D立方体 动态3D图形的绘制,需要具备一些基础的线性代数…

mysql面试题8:MySQL的日志有哪些?MySQL的bin log、redo log、undo log区别和联系

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL的日志有哪些? MySQL的日志有以下几种,以及查看这些日志的命令和操作步骤如下: 错误日志(Error Log): 查看错误日志的命令:SHOW VARI…

2023.10.01-winxpsp3绿色安装jdk1.8

参考: 如何在XP系统配置java8(jdk8)环境 - 简书 jdk-8u381-windows-i586.exe jdk-8u202-windows-i586.exe 实验了一下,8u381不支持winxp xp3 下载地址: https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.htmlhttps://download.oracle.com/otn/ja…

基于Java的电影院购票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Strategy

Strategy 动机 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂; 而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对…