返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >在redis中防止消息丢失的机制
  • 731
分享到

在redis中防止消息丢失的机制

redis防止消息丢失redis避免丢失redis丢失 2023-02-08 09:02:35 731人浏览 薄情痞子
摘要

目录如何在Redis中防止消息丢失前言同步的事务——停止等待同步的事务——连续ARQ异步的事务——回调机制消息

如何在redis中防止消息丢失

前言

项目中,由于网络问题,我们很难保证生产者发送的消息能100%到达消息队列服务器,也就是说有消息丢失的可能性,因 此,生产者就必须具有消息丢失检测和重发机制,也就是我们常说的消息队列的事物机制。

不能把可靠性的保证全部交给TCP,TCP只保证了传输层的可靠传输,但是无法保证与应用层的交互是否出错 TCP无法给应用层任何反馈,因此必须在应用层处理差错

同步的事务——停止等待

所谓停止等待协议就是没发送完一组数据后,等待对方确认并且收到确认后,再发送下一组数据。

在这里插入图片描述

同步的事务——连续ARQ

类似于tcp的滑动窗口模型

在这里插入图片描述

异步的事务——回调机制

生产者在发送消息的时候,注册一个回调函数,这样生产者便不用停下来等待确认了,而是可以一直持续发送消息,当消息到达消息队列服务器的时候,服务器便会调用生产者注册的回调函数,告知生产者消息发送成功了还是失败了,进而做进一步的处理,从而提高了并发量。

在这里插入图片描述

消息的幂等处理

由于网络原因,生产者可能会重复发送消息,因此消费者方必须做消息的幂等处理,常用的解决方案有:

  • 查询操作:查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select是天然的幂等操作;
  • 删除操作:删除操作也是幂等的,删除一次和多次删除都是把数据删除。(注意可能返回结果不一样,删除的数据不存在,返回0,删除的数据多条,返回结果多个) ;
  • 唯一索引,防止新增脏数据。比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建资金账户多个,那么给资金账户表中的用户ID加唯一索引,所以一个用户新增成功 一个资金账户记录。要点:唯一索引或唯一组合索引来防止新增数据存在脏数据(当表存在唯一索引,并发 时新增报错时,再查询一次就可以了,数据应该已经存在了,返回结果即可);
  • token机制,防止页面重复提交。业务要求: 页面的数据只能被点击提交一次;发生原因: 由于重复点击或 者网络重发,或者Nginx重发等情况会导致数据被重复提交;解决办法: 集群环境采用token加redis(redis单 线程的,处理需要排队);单JVM环境:采用token加redis或token加jvm内存。处理流程:1. 数据提交前要向 服务的申请token,token放到redis或jvm内存,token有效时间;2. 提交后后台校验token,同时删除 token,生成新的token返回。token特点:要申请,一次有效性,可以限流。注意:redis要用删除操作来判 断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用;
  • 悲观锁——获取数据的时候加获取。select * from table_xxx where id=‘xxx’ for update; 注意:id字段一 定是主键或者唯一索引,不然是锁表,会死人的悲观锁使用时一般伴随事务一起使用,数据锁定时间可能会 很长,根据实际情况选用;
  • 乐观锁——乐观锁只是在更新数据那一刻锁表,其他时间不锁表,所以相对于悲观锁,效率更高。乐观锁的 实现方式多种多样可以通过version或者其他状态条件:1. 通过版本号实现update table_xxx set name=#name#,version=version+1 where version=#version#如下图(来自网上);2. 通过条件限制 update table_xxx set avai_amount=avai_amount-#subAmount# where avai_amount-#subAmount# >= 0要求: quality-#subQuality# >= ,这个情景适合不用版本号,只更新是做数据安全校验,适合库存模型,扣份额和 回滚份额,性能更高;
  • 分布式锁——还是拿插入数据的例子,如果是分布是系统,构建全局唯一索引比较困难,例如唯一性的字段没法 确定,这时候可以引入分布式锁,通过第三方的系统(redis或ZooKeeper),在业务系统插入数据或者更新数据,获 取分布式锁,然后做操作,之后释放锁,这样其实是把多线程并发的锁的思路,引入多多个系统,也就是分布式系 统中得解决思路。要点:某个长流程处理过程要求不能并发执行,可以在流程执行之前根据某个标志(用户ID+后缀 等)获取分布式锁,其他流程执行时获取锁就会失败,也就是同一时间该流程只能有一个能执行成功,执行完成 后,释放分布式锁(分布式锁要第三方系统提供);
  • select + insert——并发不高的后台系统,或者一些任务JOB,为了支持幂等,支持重复执行,简单的处理方法 是,先查询下一些关键数据,判断是否已经执行过,在进行业务处理,就可以了。注意:核心高并发流程不要用这 种方法;

到此这篇关于如何在redis中防止消息丢失的文章就介绍到这了,更多相关redis防止消息丢失内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 在redis中防止消息丢失的机制

本文链接: https://lsjlt.com/news/194583.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 在redis中防止消息丢失的机制
    目录如何在redis中防止消息丢失前言同步的事务——停止等待同步的事务——连续ARQ异步的事务——回调机制消息...
    99+
    2023-02-08
    redis防止消息丢失 redis避免丢失 redis丢失
  • RabbitMQ消息丢失怎么防止
    这篇文章主要介绍“RabbitMQ消息丢失怎么防止”,在日常操作中,相信很多人在RabbitMQ消息丢失怎么防止问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”RabbitMQ消息丢失怎么防止”的疑惑有所帮助!...
    99+
    2023-07-05
  • redis的消息队列防止数据丢失的方法
    序言:redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set ...
    99+
    2024-04-02
  • 一文看懂RabbitMQ消息丢失如何防止
    目录一.RabbitMQ消息丢失的三种情况第一种:第二种:第三种:二.RabbitMQ消息丢失解决方案1.针对生产者方案1 :开启RabbitMQ事务方案2: 使用confirm机制...
    99+
    2023-03-24
    JavaRabbitMQ RabbitMQ消息丢失
  • mq消息丢失补偿机制是什么
    MQ消息丢失补偿机制是一种在消息中间件(MQ)中,当消息发送或消费遇到异常情况导致消息丢失时,能够进行补偿和保证消息不丢失的一种机制...
    99+
    2023-10-20
    mq
  • Redis在消息队列中的妙用
    Redis在消息队列中的妙用消息队列是一种常见的解耦架构,用于在应用程序之间传递异步消息。通过将消息发送到队列中,发送者可以在不等待接收者响应的情况下继续执行其他任务。而接收者可以在适当的时间从队列中获取消息并进行处理。Redis是一种常用...
    99+
    2023-11-07
    redis 消息队列 妙用
  • 深入浅析Android中的消息机制
    本篇文章给大家分享的是有关深入浅析Android中的消息机制,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、简介Android的消息机制主要是指Handler的运行机制,那么...
    99+
    2023-05-31
    android 消息机制 roi
  • 队列在PHP与MySQL中的消息确认机制和消息重试的处理方法
    引言:随着互联网应用的发展,很多在线服务需要处理大量的请求,而这些请求往往需要一个异步的处理方式。队列是一种常见的解决方案,可以有效地将请求与处理解耦,提高系统的性能和可靠性。本文将介绍队列在PHP与MySQL中的消息确认机制和消息重试的处...
    99+
    2023-10-21
    队列 消息确认 消息重试
  • Go语言中如何处理并发通信中的消息丢失问题?
    Go语言中如何处理并发通信中的消息丢失问题?在并发编程中,消息传递是一种常见的通信方式。在Go语言中,我们通常使用通道(channel)来进行并发通信。然而,由于并发编程的特性,存在着消息丢失的风险。本文将介绍如何在Go语言中处理并发通信中...
    99+
    2023-10-22
    Go语言 并发通信 消息丢失
  • 怎么在Redis中实现缓存失效机制
    在Redis中,可以通过设置过期时间来实现缓存失效机制。可以使用EXPIRE命令来设置某个键的过期时间,当到达过期时间时,Redis...
    99+
    2024-03-11
    Redis
  • Kafka中的消息保证机制有哪些
    Kafka中的消息保证机制主要包括以下几种: At most once(至多一次):消息可能丢失,但不会被重复消费。 At lea...
    99+
    2024-04-02
  • Kafka中的消息复制机制是如何实现的
    Kafka中的消息复制机制是通过复制分区来实现的。在Kafka中,每个主题可以分为多个分区,每个分区可以有多个副本。当生产者发送消息...
    99+
    2024-04-02
  • Win8系统玩LOL游戏提示"关闭程序以防止信息丢失"的解决方法
      Win8系统玩LOL游戏提示"关闭程序以防止信息丢失",如下图所示:   Win8系统玩LOL游戏提示"关闭程序以防止信息丢失"的解决方法:   方法一: 如果“内存不足&rd...
    99+
    2022-06-04
    解决方法 提示 程序
  • 深入探究 RocketMQ 事务机制的实现流程,为什么它能做到发送消息零丢失?
    本文来自狸猫技术窝专栏《从零开始带你成为消息中间件实战高手》,是作者原子弹大侠开放的试读1、解决消息丢失的第一个问题:订单系统推送消息领丢失既然我们已经明确了消息在基于MQ传输的过程中可能丢失的几个地方,那么我们接着就得一步一步考虑如何去解...
    99+
    2023-06-03
  • Android编程中的消息机制实例详解
    本文实例讲述了Android编程中的消息机制。分享给大家供大家参考,具体如下: 在分析Android消息机制之前,我们先来看一段代码: public class MainAc...
    99+
    2022-06-06
    消息机制 Android
  • 队列在PHP与MySQL中的消息分发机制及应用场景
    摘要:队列是一种常见的消息传递机制,在PHP与MySQL中的应用场景非常广泛。本文将介绍队列在PHP与MySQL中的消息分发机制和应用场景,并提供具体的代码示例。一、引言队列是一个典型的先进先出(FIFO)的数据结构,在软件开发中被广泛应用...
    99+
    2023-10-21
    应用场景 队列 消息分发
  • d3dx9_43.dll丢失在win7计算机中的解决方案
    如何解决win7计算机中d3dx9_43.dll丢失的问题?3dx9_43.dll是计算机系统组件中directX9的dl组件。没有这个组件玩游戏,就会有游戏无法启动这个程序的提示。想要解决win7计算机中d3dx9_43.dl丢失问题的用...
    99+
    2023-07-16
  • HTML5中页面消息传输机制的示例分析
    这篇文章主要介绍HTML5中页面消息传输机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!HTML5 的Message API能够让HTML5页面之间传递消息,甚至这些页面...
    99+
    2024-04-02
  • Android中利用App实现消息推送机制的代码
    1.消息推送机制 服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭。 我想到了一句话:don't call me,i will c...
    99+
    2022-06-06
    app Android
  • PHP 框架中的事件处理和消息传递机制
    php 框架中的事件处理和消息传递机制通过监听特定事件并执行回调函数实现组件间通信。消息传递机制则通过在消息队列中发送和接收消息实现异步处理。实战案例包括用户注册事件、订单处理事件和邮件...
    99+
    2024-05-23
    事件处理 消息传递 用户注册
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作