首页 > 数据库 >[Redis]消息队列

[Redis]消息队列

时间:2024-08-23 22:16:30浏览次数:9  
标签:0.1 队列 Redis 6379 mq 消息

Redis如何实现消息队列

1、使用List
List最为简单和直接,主要通过lpush、rpop存储和读取消息队列的(先进先出)
ruby 代码解读复制代码127.0.0.1:6379> lpush mq "firstMsg" #推送消息 firstMsg
(integer) 1
127.0.0.1:6379> lpush mq "secondMsg" #推送消息 secondMsg
(integer) 2
127.0.0.1:6379> rpop mq #接收到消息
"firstMsg"
127.0.0.1:6379> rpop mq #接收到消息
"secondMsg"

2、使用Zset
ZSet 实现消息队列的方式和 List 类似,zadd 和 zrangebyscore 来实现存入和读取消息
二、Redis如何实现延迟消息队列
ZSet 多了一个分值(score)属性,用它来存储时间戳,用多个线程轮询Zset获取到期的任务进行处理,以此来实现延迟消息队列等,步骤如下:

利用 zadd 向集合中插入元素,以元素的时间戳(超时时间)作为 score
利用 zrangebyscore 以 0 < score <= 当前时间戳 进行获取需要处理的元素
当有满足的条件的元素, 先删除zrem该元素(保证不被其他进程取到),再进行业务逻辑处理;

问题一:延迟队列满足条件的元素为空(或者集合为空)时候,进程会频繁不断向 redis 服务获取满足条件元素,这样会造成 redis 服务资源占用和浪费 ->
可以在没有取到满足的条件时候让程序阻塞一段时间unsleep(10000),这种方法实际上就是用时间换取资源,注意控制阻塞时间长短,不宜太短,也不宜太长(影响即时性)
问题二:有可能出现 zrangebyscore 和 zrem非一个客户端,即原子性问题 -> 采用 lua 脚本解决
三、Redis实现队列的的缺陷

消息没有持久化,如果服务器宕机或重启,消息将会丢失
没有ACK机制,如果消费失败,消息会丢失
没有队列监控、出入对性能差

标签:0.1,队列,Redis,6379,mq,消息
From: https://www.cnblogs.com/DCFV/p/18377156

相关文章

  • [消息队列]kafka
    Kafka如何保证消息的消费顺序?我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了2个消息,这2个消息对应的操作分别对应的数据库操作是:更改用户会员等级。根据会员等级计算订单价格。假如这两条消息的消费顺序不一样造成的最终结果就会......
  • Linux下Redis的安装和部署(哨兵模式)
    1.哨兵模式配置文件redis服务 redis端口 哨兵端口 主从redis-1 7001 27001 主节点redis-2 7002 27002 从节点redis-3 7003 27003 从节点下载Rediscurl-Ohttp://download.redis.io/releases/redis-6.0.6.tar.gz解压Redistarxzvfredis-6.0.6.tar.gz进入redis-6.0.6目......
  • 数据结构day04(队列 Queue 循环队列、链式队列)
    目录【1】队列Queue1》队列的定义 2》循环队列3》链式队列 【1】队列Queue1》队列的定义队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(FirstInFirstOut)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端......
  • python——redis
    1.什么是Redis?Redis是一种高性能的键值存储数据库,它不仅可以存储字符串,还可以存储复杂的数据结构如列表、集合、哈希等。Redis常用于缓存、会话管理、实时数据处理等场景。2.环境准备在使用Redis之前,需要安装Redis服务器和Redis的Python客户端库。2.1安装......
  • Android开发 - Looper 类处理异步任务和消息解析
    什么是LooperLooper是一个非常重要的概念,它与线程、消息队列和处理异步任务密切相关。是Android中用于管理线程的消息循环的类。它与线程中的MessageQueue结合工作,用于处理异步任务和消息Looper的主要概念消息队列(MessageQueue)一个用于存放要处理的消息和任务的队......
  • docker对的tomcat、mysql、redis、nginx的安装
    本章篇章主要讲解了docker对常用软件的安装说明总体步骤:搜索镜像、拉取镜像、查看镜像、启动镜像、停止容器、移除容器tomcatdockerseachertomcat//也可以在dockerhub上面查找tomcat镜像dockerpulltomcat从dockerhub上拉取tomcat镜像到本地dockerimages//查看是否......
  • 洛谷P10878 [JRKSJ R9] 在相思树下 III && 单调队列
    传送门:P10878[JRKSJR9]在相思树下III将军啊,早卸甲,他还在廿二,等你回家……一道练习单调队列的好题qwq题目意思:很明白了,不再复述。(注意$\foralli$表示对于任意的i,可理解为所有)思路:贪心是很明显的,因为我们要让最后的值最大,首先要把小的值删掉。最后的答案就是进......
  • Redis为什么会阻塞
    Redis的一些阻塞点BigKey删除,删除数据库,AOF日志同步聚合操作,全量查询操作,从库读取RDB文件。其中删除BigKey,AOF日志,删除数据库可以异步执行。聚合操作,全量查询,从库读取RDB文件如果过大的话都是会造成阻塞的。CPU也会影响RedisCPU分为多个物理核,一个物理核分为两个逻辑核。......
  • Redis实战
    Redis的String类型有什么缺点在花费内存方面,String花费的内存很多。如果存储的是64位有符号整数的话,就是一个8字节Long类型整数。如果是包含字符的话,就会用SDS,也就是简单字符串来存储,SDS中会把存储的数据最后加一个\0,还会存储使用的buf的长度,实际分配的buf的长度。不仅如此,有......
  • 在Java中实现通过TCP方式发送和接收Socket消息,包含在多线程状态下的实现
    导言:公司的代码,本来客户端client是前端的unity发送请求的,后面自己写的时候需要在本地进行测试,所以也用Java实现了前端,就写出来记录一下。本文主要展示客户端client跟服务端server基础代码,里面的一些业务逻辑没有进行展示正文1.创建client端首先我们需要创建一个client端进......