Redis-异步消息[通俗易懂]

Redis-异步消息[通俗易懂]关于异步消息,大家都知道,如下: 这些用起来都是比较复杂的,RabbitMQ先要创建Exchange,在创建Queue,还要将Queue和Exchange通过某种规则绑定起来。发消息之前要指定rout

Redis-异步消息

关于异步消息,大家都知道,如下:

Redis-异步消息[通俗易懂]

 

  这些用起来都是比较复杂的,RabbitMQ先要创建Exchange,在创建Queue,还要将Queue和Exchange通过某种规则绑定起来。发消息之前要指定routing-Key,还要控制头部信息。

  即使你只需要一组消息者。那么你就要经历上面繁琐的过程。

  但是Redis对于那些轻量级和只有一组消息者的消息队列;

  Redis的list数据结构常用来作为异步消息队列来使用。使用rpush/lpush操作入队列,用lpop/rpop来出队列。我们都知道list是一个链表,所以操作方式如下

Redis-异步消息[通俗易懂]

 

 

 当然我们会遇到一些问题,比如队列空了会怎么样?客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息,再进行处理。如此循环往复,这便是作为队列消费者的客户端的生命周期。 可是如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop,没有数据,接着再 pop,又没有数据。这就是浪费生命的空轮询。空轮询不但拉高了客户端的 CPU,redis 的 QPS 也会被拉高,如果这样空轮询的客户端有几十来个,Redis 的慢查询可能会显著增多。 通常我们使用 sleep 来解决这个问题,让线程睡一会,睡个 1s 钟就可以了。不但客户端的 CPU 能降下来,Redis 的 QPS 也降下来了。(摘自Redis深度历险) 

 睡眠会导致消息的延迟增大·,多个消费者情况下,延迟会有所下降,因为每个消费者都是的睡眠时间是岔开来的。通过阻塞读:blocking,也就是这两个命令:blpop,brpop。

当然还有会空闲连接自动断开,顾名思义,一直阻塞,Redis客户端就成了闲置的,时间长了,服务器会断开连接,减少闲置资源,这时候就会抛出异常,所以编写消费者的时候,注意捕获异常,重试。

延时队列:

这种方式比较适合异步消息处理,将当前冲突的请求扔到另一个队列延后处理以避开冲突

我们将消息序列化成一个字符串作为 zset 的 value,这个消息的到期处理时间作为 score,然后用多个线程轮询 zset 获取到期的任务进行处理,多个线程是为了保障可用性,万一挂了一个线程还有其它线程可以继续处理。因为有多个线程,所以需要考虑并发争抢任务,确保任务不能被多次执行。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10195.html

(0)
上一篇 2023-01-23 18:00
下一篇 2023-01-23

相关推荐

  • MySQL入门学习[通俗易懂]

    MySQL入门学习[通俗易懂]数据库的好处 1.持久存到本地 2.可以实现结构化查询,方便管理 数据库相关概念 1.DB:数据库,保存一组有组织的数据的融通器 2.DBMS:数据库管理系统,又称数据库软件(产品),用于管理DB中…

    2023-04-14
    155
  • [学习笔记] Oracle字段类型、建表语句、添加约束

    [学习笔记] Oracle字段类型、建表语句、添加约束SQL语句介绍 数据定义语言(DDL),包括 CREATE、 ALTER、 DROP等。 数据操纵语言(DML),包括 INSERT、 UPDATE、 DELETE、 SELECT … FOR UPD

    2023-02-03
    142
  • python不存在并堆栈溢出(python会不会溢出)

    python不存在并堆栈溢出(python会不会溢出)stack overflow是堆栈溢出。堆栈溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆栈溢出很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。请对应检查一下。

    2023-12-03
    125
  • Windows 下安装 MariaDB (mariadb-10.4.13-winx64.zip) 数据库[亲测有效]

    Windows 下安装 MariaDB (mariadb-10.4.13-winx64.zip) 数据库[亲测有效]1. 官网下载 mariadb-10.4.13-winx64.zip , 并解压 2. 在对应的bin目录下, 执行cmd命令, 以管理员身份运行cmd, 然后执行 mysql_install_db…

    2023-03-07
    297
  • 利用Python生成唯一标识符UUID

    利用Python生成唯一标识符UUID在计算机领域中,唯一标识符(Universal Unique Identifier,简称UUID)是用于识别对象的一种方式。它是16字节(128位)长的字符串,通常表示为32个十六进制数字,用连字符分成5个组。UUID 相较于传统的识别方式,如自增长的数字和时间戳等,由于其不可预测和不易冲突的特性,在数据库和分布式系统中应用得非常广泛。

    2024-05-19
    65
  • 使用命令更新pip

    使用命令更新pipPip是Python语言中的包管理器,可以安装、升级和卸载Python包。Pip是Python的标准安装程序,可以很方便地为Python安装一系列的第三方库,以便让开发人员在使用Python过程中不必自己从头实现工具函数,而是可以直接调用别人开发好的库函数。本文将介绍如何使用命令更新pip。

    2024-09-06
    28
  • MySQL按指定字符合并及拆分[通俗易懂]

    MySQL按指定字符合并及拆分[通俗易懂]按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符)。本文将举例演示如何进行按照指定字符合并及拆分。 1、 合并 M

    2023-03-15
    160
  • Python实践:优化Web应用性能

    Python实践:优化Web应用性能Web应用的性能优化对于提升用户体验和增加网站的转化率至关重要。Python作为一种高效、简洁且易于学习的编程语言,越来越受到Web开发者的喜爱。本文将从多个方面介绍如何使用Python优化Web应用的性能,帮助你更好地提升网站的访问速度和用户体验。

    2024-01-15
    102

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注