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)

大家都在看

  • 无线配置多一个路由器作为家庭wifi的无线热点?

    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」 https://mp.weixin.qq.com/s/8OcDnY3O6ux41GntesHHcg 手头…

    Linux 2023年6月6日
    0102
  • 零成本搭建个人博客搭建篇

    为什么要搭建个人博客 尽管已经有很多成型的在线博客平台供大家使用(csdn,博客园,掘金等),但是它们都有一些很明显的弊端,例如账号以及博客内容受到监管,所有权不属于作者本人,对于…

    Linux 2023年6月7日
    056
  • gem 更换源及目前能用的源

    1.查看gem源 gem source -l 2.删除源 gem source -r 3.添加源 gem sources –add Original: https://…

    Linux 2023年6月8日
    0106
  • Linux下定时自动备份Docker中所有SqlServer数据库

    给出一个备份的范例 #!/bin/bash #设置mssql备份目录 folder=/var/opt/mssql/data/databack/ day=date +%Y%m%d%H…

    Linux 2023年6月14日
    0103
  • zabbix4.0 本地安装详解及步骤

    安装前说明下,下面安装过程中涉及selinux部分仅供参考,可能会导致启动服务时产生各种报错,作者也是在折腾了无数日夜后报错不断而放弃治疗,直接永久关闭了selinux(啊,没有s…

    Linux 2023年6月8日
    094
  • CentOS7下安装python3.7

    以原码编译的方式安装 1.官网下载python3.7软件包 2.上传至Linux中,并解压 tar -zxvf python-3.7.2.tgz 3.安装gcc和python所需依…

    Linux 2023年6月6日
    079
  • cmd学习笔记

    for %var in (set) do commond for %one in (1,2,3,4,5) do echo –>1 –>2 –>3 –&gt…

    Linux 2023年6月7日
    0114
  • MySQL概述

    数据库 ~存储数据的仓库,数据是有组织的进行存储 ~英文:Database,简称DB 数据库管理系统 ~管理数据库的大型软件 ~英文:DataBase Management Sys…

    Linux 2023年6月7日
    096
  • Centos 7防火墙策略配置指南

    Centos 7防火墙策略配置指南 —— 清听凌雪慕忆 @ 1. 开启防火墙 1.1 user切换到root用户 1.2 查看防火墙服务状态 1.3 查看firewall的状态 1…

    Linux 2023年6月7日
    0142
  • 小白上手Linux系统安装jdk教程

    Eg:将上传后的jdk,解压到/home/lzh/jdk目录下,命令如下: tar -zxvf ./ jdk 版本号 -C /home/lzh/jdk/ 注意末尾必须加&#8221…

    Linux 2023年5月27日
    076
  • ASCLL 字符码

    信息在计算机上是用二进制数表示的,这种表示法让人很难理解。因此,计算机上都配有输入和输出设备,这些设备的主要目的就是以一种人类可阅读的形式将信息在这些设备上显示出来供人阅读理解。为…

    Linux 2023年6月7日
    0107
  • 如何正确地使用Entity Framework Database First

    毕设依旧在不紧不慢地以每天解决一个问题的进度进行中。今天遇到的问题就是在建立数据模型时遇到的。因为项目是基于数据库构建的,所以理所应当地采用DB First来构造实体类和DbCon…

    Linux 2023年6月14日
    0101
  • MySQL——用户和权限管理

    由用户名和主机名组成 格式:’user_name’@’host’ host必须要用引号括起来 注意:host可以是一个主机名也可以是…

    Linux 2023年6月7日
    088
  • docker 常用批量操作

    显示所有镜像的tag docker images |awk ‘{print $1":"$2}’ 删除所有镜像 docker images |awk ‘{prin…

    Linux 2023年6月6日
    096
  • 嵌入式软件开发中必备软件工具

    1、前言 作为一个软件开发人员,除了程序能力素养方面外,还应该熟练地使用各种常用的辅助工具,所谓”工欲善其事,必先利其器”;通过这些工具能提升自己的专业素养…

    Linux 2023年6月7日
    096
  • 在 IconFont 上获取图标资源的操作方法与感悟

    如何在 IconFont 上获取图标资源 阿里巴巴矢量图标库网站(https://www.iconfont.cn/)上提供了非常丰富的图标资源,包括 SVG、AI、PNG、字体图标…

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