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

这篇具有很好参考价值的文章主要介绍了一文拿捏分布式、分布式缓存及其问题解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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秒确保数据库已更新)再执行缓存清除。进行两次删除,且中间需要延迟一段时间

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

上述方案在极端情况下,如果第三步删除失败仍然可能导致数据一致性问题,解决方案有:文章来源地址https://www.toymoban.com/news/detail-727517.html

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

到了这里,关于一文拿捏分布式、分布式缓存及其问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis从基础到进阶篇(四)----性能调优、分布式锁与缓存问题

    目录 一、Redis 集群演变 1.1 Replication+Sentinel*高可用 1.2 Proxy+Replication+Sentinel(仅仅了解) 1.3 Redis Cluster 集群 (重点) 1.3.1 Redis-cluster架构图 1.3.2 工作原理 1.3.3 主从切换 1.3.4 副本漂移 1.3.5 分片漂移 二、Redis版本历史(增加了解) 三、Redis 5.0 源码清单 (对源码感兴趣的,看一下

    2024年02月09日
    浏览(45)
  • Redis 分布式锁存在什么问题 ?如何解决 ?

    目录 1. 如何实现分布式锁 2. Redis 分布式锁存在什么问题 2.1 解决死锁问题 2.2 解决锁误删问题 Redis 天生就可以作为一个分布式系统来使用,所以它实现的锁都是分布式锁。 Redis 可以通过 setnx(set if not exists)命令实现分布式锁~ setnx mylock true  -  加锁 del mylock  -  释放锁 通过

    2024年02月11日
    浏览(42)
  • 分布式系统架构设计之分布式缓存技术选型

    随着互联网业务的快速发展,分布式系统已经成为了解决大规模并发请求、高可用性、可扩展性等问题的重要手段。在分布式系统中,缓存作为提高系统性能的关键技术,能够显著降低数据库负载、减少网络延迟、提高数据访问速度。当面对大量并发请求时,如果每次都直接

    2024年02月03日
    浏览(118)
  • 分布式:一文吃透分布式事务和seata事务

    什么是事务 事务是并发控制的单位,是用户定义的一个操作序列。 事务特性 原子性(Atomicity): 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 一致性(Consistency): 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性

    2024年02月07日
    浏览(62)
  • SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】

    上一篇实现了单体应用下如何上锁,这一篇主要说明如何在分布式场景下上锁 上一篇地址:加锁 需要注意的点是: 在上锁和释放锁的过程中要保证 原子性操作 核心是上锁和解锁的过程 关于解锁使用脚本参考:SET key value [EX seconds] [PX milliseconds] [NX|XX] 3.1 一个服务按照多个端口同时

    2023年04月10日
    浏览(52)
  • 论文-分布式-并发控制-并发控制问题的解决方案

    目录 参考文献 问题 解法与证明 易读版本 参考文献 Dijkstra于1965年发表文章Solution of a Problem in Concurrent Programming Control,引出并发系统下的互斥(mutual exclusion)问题,自此开辟了分布式计算领域 Dijkstra在文中给出了基于共享存储原子性访问的解决方案只有十多行代码,但阅读起来

    2024年02月08日
    浏览(49)
  • Redis分布式缓存

    -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: Redis有两种持久化方案: RDB持久化 AOF持久化        RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做 Redis数据快照 。简单来说就是把 内存中的所有数据都记录到磁盘 中。当Redis实例故障重启后,

    2024年02月12日
    浏览(51)
  • Redis 分布式缓存

    单点 Redis 的问题及解决 数据丢失:实现Redis数据持久化 并发能力:搭建主从集群,实现读写分离 存储能力:搭建分片集群,利用插槽机制实现动态扩容 故障恢复能力:利用哨兵机制,实现健康检测和自动恢复 RDB RDB全称Redis Database Backup file (Redis数据备份文件),也被叫做

    2024年02月10日
    浏览(51)
  • 分布式缓存

    – 基于Redis集群解决单机Redis存在的问题 Redis有两种持久化方案: RDB持久化 AOF持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是 把内存中的所有数据 都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快

    2023年04月25日
    浏览(46)
  • Golang实现Redis分布式锁解决秒杀问题

    先写一个脚本sql,插入2000个用户 登录是通过2个字段,一个是mobile,一个是password,生成了mobile从1到2000,密码默认是123456 然后写一个单元测试,实现新注册的2000个用户登录,然后获取token 我们使用有缓冲的通道和sync.WaitGroup信号量,来控制协程的数量,经过测试,发现limi

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包