Redis功能拓展-消息队列

1.什么是消息队列,消息队列解决什么问题?
从宏观上看,消息队列就是围绕队列这个数据结构而拓展开的一段特殊程序,将这类程序单独部署就可以称之为消息中间件(也称:消息队列)。在分布式系统中消息队列最常用与解决的问题是:解耦以及流量的削峰填谷。

2.Redis中基于List结构实现消息队列的方式

常见的消息中间件专业户有Kafk,RabbitMQ,ActiveMQ,RocketMQ等等,但实际上除了这些专业户外Redis适不适合作为消息中间件呢?对于消息队列来说最基本的需求是:1.必须满足队列的数据结构以及相关操作;2.必须要保证消息的快速读写;3.对于业务侧的其他需求。对于第1点Redis的list数据结构恰好可以满足,而第2点由于Redis的高性能自然也可以满足,那么Redis是不适用于消息队列就必须得看业务侧的一些其他常见需求。比如说:1.消息的可靠性保证;2.消息的消费确认;3.消息的重复消费;4.消息的保序;5.消息的堆积能力;

2.1消息的可靠性保证

Redis自身提供的AOF的方式来保证数据的可靠性,换句话只要生产者向Redis发送了一条消息,这条消息被成功执行,该数据就完成了持久化。在这之后的任何一个时间点Redis宕机,这条消息都可以被恢复,当然前提是该消息没有被消费。

2.2消息的消息确认机制

消费者从消息队列消费消息时,可能会因为网络问题而导致该次消息丢失,此时消费者再次从消息队列中获取数据的时候,消费者获取的就是一条新的消息。换句话说,有消息逃逸了。如果需要保证消息的确认机制,只用单个List是无法完成的,需要有3个的List结构去共同维护。如:一个正常的list结构List-A、一个正在消费中的list结构ListB、一个消费失败的list结构ListC。生产者向ListA生产消息,消费者首先向ListA获取消息时,把获取到的数据先发送到ListB,这一步必须保证原子操作;如果消息消费成功则从ListB中删除,消费失败则将其放入到ListC中。其实Redis中新的特性Streams就是使用内部队列留存消费组里每个消费组的消息,直到消费者使用XACK命令通知Streams”消息已经处理完成”。

2.3消息的重复消费

List的数据在被取出之后,该数据就不存在了,所以不存在重复消费的问题。

2.4消息的保序

多个生产者向队列生产消息的时候,由于是通过网络进行发送的所以谁先进入到队列是无法保证的。而消息的顺序通常来说是指消息在被消息队列接受后的顺序与消费的先后顺序是否一致。List结构自然也是满足的。如果需要对消息做严格的保序,即消息的顺序是按照生产者生产消息的先后,那么就需要在消息体重添加序号ID来去确保顺序,消费者在消费过程中自然也是需要使用该序号ID来进行排序再消费。

2.5消息的堆积能力

对于消息队列来说,削峰填谷是一个非常典型的应用场景。这也意味着在流量高峰期,生产者的速度会远远大于消费者的速度,那么久就会有大量的消息堆积在队列中。而Redis是基于内存的,消息的堆积能力完全受限于实例所分配的内存。所以说基于Redis的消息队列在消息的堆积能力是较差的。

因此基于Redis的消息队列一般只适用于并发量小,消息体积小的场景。

Original: https://www.cnblogs.com/zhenjungan/p/16564214.html
Author: zhenjungan
Title: Redis功能拓展-消息队列

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581870/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 用全域安全防范美国NSA对西工大的网络攻击

    上周写的一篇文章《全域安全:一种运行时安全管理模型》,向大家介绍了全域安全管理模型,它是如何在Laxcus分布式操作系统的分布环境下,解决了分布式应用业务的全流程安全管理问题。其中…

    Linux 2023年6月6日
    0107
  • Spring Boot中异步请求和异步调用

    一、SpringBoot中异步请求的使用 1、异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在…

    Linux 2023年6月7日
    0121
  • prometheus监控redis集群

    【1】利用 redis_exporter 监控 redis 集群 (1.0)redis_exporter 以前都是用傻办法,一个实例一个采集器; redis_exporter 支持…

    Linux 2023年5月28日
    0108
  • CentOS-7配置fastDFS文件服务器和安装Nginx

    配置步骤实在是很繁琐,听我慢慢道来! 主要是配置管理(tracker)和存储(storage)返回地址样式 –> 域名/组名/磁盘名/目录名/文件名 &#8211…

    Linux 2023年6月13日
    097
  • AndroidManifest.xml文件校验工具

    一、前言 前段时间总能碰见AndroidManifest固定字节被篡改的情况,每次都要拿着图一个个去对比那个固定字节处被篡改了,干脆直接写了个校验工具,这里分享给大家,工具没什么技…

    Linux 2023年6月8日
    0109
  • CentOS 6 安装并配置 MySQL 5.6

    1. 添加 MySQL Yum 存储库 将MySQL Yum存储库添加到系统的存储库列表中; 1.1 到MySQL官网下载MySQL Yum存储库(https://dev.mysq…

    Linux 2023年6月13日
    0101
  • SpringBoot中通过AOP整合日志文件

    1.SpringBoot中通过AOP整合日志文件 1. 导入相关的依赖 org.springframework.boot spring-boot-starter org.sprin…

    Linux 2023年6月14日
    0102
  • MySQL回表查询

    一.MySQL索引类型 1.普通索引:最基本的索引,没有任何限制 2.唯一索引(unique index):索引列的值必须唯一,但是允许为空 3.主键索引:特殊的唯一索引,但是不允…

    Linux 2023年6月6日
    0112
  • 技术漫谈之——Jectpack Compose

    最近Jetpack Compose发布了Beta版本,抽时间了解了一下Compose带来的改变和其中的一些原理。本文不会讲解具体API,只是比较随意的分享自己的一些疑问以及在探寻答…

    Linux 2023年6月13日
    0104
  • 斐波那契数列前1000项

    斐波那契数列前1000项 {1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,177…

    Linux 2023年6月6日
    096
  • Question08-查询没学过”张三”老师授课的同学的信息

    * SELECT * FROM Student WHERE SID NOT IN ( SELECT DISTINCT Student.SID FROM Student , SC ,…

    Linux 2023年6月7日
    0100
  • Shell 第二章《流控》

    前言 无论什么编程语言都离不开条件判断(流控)。SHELL也不例外。例如,用户输入的密码不够长时提示用户,你太短了例如,用户输入了备份的目录,如果有目录继续备份,如果没有目录创建目…

    Linux 2023年6月6日
    0155
  • 我可以不在校园

    我在校园自动打卡,仅作学习使用。 我在校园自动打卡,仅作学习使用 直达电梯:我可以不在校园 posted @2021-11-19 17:38 DominicKK 阅读(258 ) …

    Linux 2023年6月8日
    0115
  • CentOS 7替换默认软件源

    安装CentOS 7后,默认源在国外,可以替换为国内的源以提升访问速度 参考https://mirrors.ustc.edu.cn/help/centos.html sudo vi…

    Linux 2023年6月6日
    088
  • Visual Studio远程调试

    在工作中有时候需要在服务器的环境下远程调试,例如调试微信相关服务的时候。 1. 下载远程调试工具 网址:https://visualstudio.microsoft.com/zh-…

    Linux 2023年6月7日
    0110
  • SA算法:从MTSP问题出发

    之前我在这篇博文中介绍了解决MTSP问题的相关思路,并附上了GitHub上的相关源码。在这篇文章中,我将详细介绍如何使用SA智能优化算法进行编程 1. SA算法的核心思路: SA(…

    Linux 2023年6月14日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球