基于Redis实现分布式消息队列(3)

使用Redis构建分布式任务队列 通过利用Redis的列表数据结构和相应的命令,我们可以实现任务的异步处理和分布式调度。在实际应用中,可以根据需求对任务队列进行更加复杂的设计和优化,例如添加任务优先级、任务超时处理等功能。在分布式系统中,任务队列是常见的组件之一,它可以实现任务的异步处理和分布式调度。Redis是一个高性能的键值存储系统,它提供了丰富的数据结构和命令,非常适合用于构建分布式任务队列。在主程序中,我们启动了两个消费者线程,并向任务队列中添加了三个任务。多个消费者可以并发地处理任务,从而实现了分布式的任务处理。 阅读详情

1、Redis是什么鬼?

Redis是一个简单的,高效的,分布式的,基于内存的缓存工具。 
假设好服务器后,通过网络连接(类似数据库),提供Key-Value式缓存服务。

简单,是redis突出的特色。 
简单可以保证核心功能的稳定和优异。

2、性能

性能方面:Redis是足够高效的。 
和Memecached对比,在数据量较小大情况下,Redis性能更优秀。 
数据量大到一定程度的时候,Memecached性能稍好。

简单结论:但总体上讲Redis性能已经足够好。

// Ref: Redis性能测试 http://www.cnblogs.com/lulu/archive/2013/06/10/3130878.html 
原则:Value大小不要超过1390Byte。

经实验得知: 
List操作和字符串操作性能相当,略差,几乎可以忽略。 
使用Jedis自带pool,“每次从pool中取用完放回“ 和 “重用单个连接“ 相比,平均用时是3倍。这部分需要继续研究底层机制,采用更合理的实验方法进一步获得数据。 
使用Jedis自带pool,性能上是满足当前访问量需要的,等有时间了再进一步深入。

3、数据类型

Redis支持5种数据类型:字符串、Map、List、Set、Sorted Set。 
List特别适合用于实现队列。提供的操作包括: 
从左侧(或右侧)放入一个元素,从右侧(或左侧)取出一个元素,读取某个范围的元素,删除某个范围的元素。

Sorted Set中元素是唯一的,可以通过名字找。 
Map可以高效地通过key找。 
假如我们需要实现finishTash(taskId),需要通过名字在队列中找元素,上面两个可能会用到。

4、原子操作

实现分布式队列首要问题是:不能出现并发问题。

Redis是底层是单线程的,命令执行是原子操作,支持事务,契合了我们的需求。

Redis直接提供的命令都是原子操作,包括lpush、rpop、blpush、brpop等。

Redis支持事务。通过类似 begin…[cancel]…commit的语法,提供begin…commit之间的命令为原子操作的功能,之间命令对数据的改变对其他操作是不可见的。类似关系型数据库中的存储过程,同时提供了最高级别的事务隔离级别。

Redis支持脚本,每个脚本的执行是原子性的。

做了一下并发测试: 
写了个小程序,随机对List做push或pop操作,push的比pop的稍多。 
记录每次处理的详细信息到数据库。 
最后把List中数据都pop出来,详细记录每次pop详细信息。 
统计push和pop是否相等,统计针对每条数据是否都有push和pop。 
500并发,没有出现并发问题。

5、集群

实现分布式队列另一个重要问题是:不能出现单点故障。

Redis支持Master-Slave数据复制,从服务器设置 slave-of master-ip:port 即可。 
集群功能可以由客户端提供。 
客户端使用哨兵,可自动切换主服务器。

由于队列操作都是写操作,从服务器主要目的是备份数据,保证数据安全。

如果想基于 sharding 做多master集群,可以结合 zookeeper 自己做。

Redis 3.0支持集群了,还没细看,应该是个好消息,等大家都用起来,没什么问题的话,可以考虑试试看。

如果 master 宕掉,怎么办? 
“哨兵”会选出一个新的master来。产生过程中,消息队列暂停服务。 
最极端的情况,所有Redis都停了,当消息队列发现Redis停止响应时,对业务系统的请求应抛出异常,停止队列服务。 
这样会影响业务,业务系统下订单、审批等操作会失败。如果可以接受,这是一种方案。 
Redis整个集群宕掉,这种情况很少发生,如果真发生了,业务系统停止服务也是可以理解的。

如果想要在Redis整个集群宕掉的情况下,消息队列仍继续提供服务。 
方法是这样的: 
启用备用存储机制,可以是zookeeper、可以是关系型数据库、可以是另外可用的Memecached等。 
本地内存存储是不可取的,首先,同步多个客户端虚拟机内存数据太复杂,相当于自己实现了一个Redis,其次,保证内存数据存储安全太复杂。 
备用存储机制相当于实现了另外一个版本的消息队列,逻辑一致,底层存储不同。这个实现可以性能低一些,保证最基本的原则即可。 
想要保证不出现并发问题,由于消息队列程序同时运行在多个虚拟机中,对象锁、方法锁无效。需要有一个独立于虚拟机的锁机制,zookeeper是个好选择。 
将关系型数据库设置为最高级别的事务隔离级别,太傻了。除了zk有其他好办法吗?

Redis集群整个宕掉的同时Zookeeper也全军覆没怎么办? 
这个问题是没有尽头的,提供了第二备用存储、第三备用存储、第四备用存储、…,理论上也会同时宕掉,那时候怎么办? 
有钱任性的土豪可以继续,预算有限的情况,能做到哪步就做到哪步。

6、持久化

分布式队列的应用场景和缓存的应用场景是不一样的。

如果有没来得及持久化的数据怎么办? 
从业务系统的角度,已经成功发送给消息队列了。 
消息队列也以为Redis妥妥地收好了。 
可Redis还没写到日记里,更没有及时通知小伙伴,挂了。可能是断电了,可能是进程被kill了。

后果会怎样? 
已经执行过的任务会再次执行一遍。 
已经放到队列中的任务,消失了。 
标记为已经完成的任务,状态变为“进行中”了,然后又被执行了一遍。 
后果不可接受。

分布式队列不允许丢数据。 
从业务角度,哪怕丢1条数据也是无法接受的。 
从运维角度,Redis丢数据后,如果可以及时发现并补救,也是可以接受的。

从架构角度,队列保存在Redis中,业务数据(包括任务状态)保存在关系型数据库中。 
任务状态是从业务角度确定的,消息队列不应该干涉。如果业务状态没有统一的规范和定义,从业务数据比对任务队列是否全面正确,就只能交给业务开发方来做。 
从分工上来看,任务队列的目的是管理任务执行的状态,业务系统把这个职责交给了任务队列,业务系统自身的任务状态维护未必准确。 
结论:任务队列不能推卸责任,不能丢数据是核心功能,不能打折扣。

采用 Master-Slave 数据复制模式,配置bgsave,追加存储到aof。

在从服务器上配置bgsave,不影响master性能。

队列操作都是写操作,master任务繁重,能让slave分担的持久化工作,就不要master做。

rdb和aof两种方法都用上,多重保险。 
appendfsync设为always。// 单节点测性能,连续100000次算平均时间,和per second比对,性能损失不大。 
性能会有些许损失,但任务执行为异步操作,无需用户同步等待,为了保证数据安全,这样是值得的。

当运维需要重启Master服务器的时候,采取这样的顺序: 
1. 通过 cli shutdown 停止master服务器, master交代完后事后,关掉自己。这时候“哨兵”会找一个新的master出来。 
万万不可以直接kill或者直接打开防火墙中断master和slave之间的连接。 
master 对外防火墙,停止对外服务,Master 自动切换到其他服务器上, 原 Master 继续持久化 aof,发送到原来各从服务器。 
2. 在原 master 上进行运维操作。 
3. 启动原 master,这时候它已经是从服务器了。耐心等待它从新 master 获取最新数据。观察 redis 日志输出,确认数据安全。 
4. 对新的 master 重复1-3的操作。 
5. 将以上操作写成脚本,自动化执行,避免人为错误。

LTspice基础教程-024.参数扫描;step指令用法 step指令用于参数扫描,扫描步骤可以是线性的,对数的或列表。 下面介绍几种常用用法: 绘制一简单电阻分压电路,如下: 线性扫描 语法:.step param <Name> <Start Value> <Stop Value> <Increment> 例:.step param Res 20 100 20 意思是R2的阻值从20变化到100,... 阅读详情

相关推荐

小华半导体HC32芯片开发使用说明

HC32F/L系列MCU在Keil MDK和IAR Workbench环境下通过工程样例进行软件开发。

小布的芯视角 5631

redis队列(set)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34023982的博客 743

不用API Key也能玩转Obsidian AI:本地大模型离线配置全攻略

本文详细介绍了如何在无需API Key的情况下,通过本地部署大型语言模型(LLM)为Obsidian注入AI能力。文章以Ollama为例,提供了从环境准备、模型选择到与Obsidian插件(如Text Generator)集成的完整配置攻略,旨在帮助用户打造一个安全、离线可用的智能笔记工作流,实现数据隐私与AI助力的完美结合。

weixin_29062963的博客 818

redis实现分布式延时队列

延时队列是一种特殊的消息队列,它允许将消息在一定的延迟时间后再进行消费。延时队列的主要特点是可以延迟消息的处理时间,以满足定时任务或者定时事件的需求。总之,延时队列通过延迟消息的消费时间,提供了一种方便、可靠的方式来处理定时任务和定时事件。它在分布式系统中具有重要的作用,能够提高系统的可靠性和性能。延时队列的实现方式可以有多种,本文介绍一种redis实现的分布式延时队列。

qq_29750559的博客 2359

一生一芯——用RTL实现最简单的处理器NPC(南大数逻计组RV32ICPU) 代码及思考参考

本文介绍自己前期用Verilog编写的基于RV32I指令集的CPU,个人认为是最简单最易懂的版本(即没做什么优化,即代码很水,没有考虑一些奇怪的情况,只适用简单指令序列,即题目所示最简单的处理器),适合新手练手Verilog以及了解简单CPU的运行过程。本文基于一生一芯,利用Verilator进行仿真,并用gtkwave查看波形,不了解verilator和gtkwave的可以看前几篇文章。

long0_o的博客 3310

RK3566添加ffpeg【Buildroot系统】

有很多人都发现了RK3566系列的芯片是不可以直接使用ffmpeg官网源码的!会报错: Not a video capture device. /dev/video0: No such device 接下来我们就来解决这个问题!!

honmy18的博客 4070

分布式Redis详解

Redis我们最近学习必备工具之一了, 接下来我们将讲解Redis的简单应用 ,以及相关原理答:跳跃表SkipList,也称之为跳表,是一种数据结构,用于在有序元素的集合中进行高效的查找操作。它通过添加多层链表的方式,提供了一种以空间换时间的方式来加速查找。跳跃表由一个带有多层节点的链表组成,每一层都是原始链表的一个子集。最底层是一个完整的有序链表,包含所有元素。每个更高层级都是下层级的子集,通过添加额外的指针来跳过一些元素。

qq_56454895的博客 2048

shopro 商城,2025年新申请的微信支付提示失败,支付提示 Get Wechat Public Cert Error 问题的修复办法

shopro 商城,最近新申请的微信支付商户 支付提示 Get Wechat Public Cert Error 问题的修复办法

行走的卡路里 1245

SpringBoot3+Vue3打造分布式医疗挂号系统

text{可用号源} = \left\lfloor \frac{\text{医生当日总号源} \times (1 - \text{预留比例})}{\text{时间段数量}} \right\rfloor $$\text{推荐分数} = \sum_{i=1}^{n} \left( \text{相似度}_i \times \text{评分}_i \right) $$前端:Vue3 + Pinia + Vite + Element Plus。数据库:垂直分片(科室/预约分离) + 水平分片(按医院ID哈希)

G2583690的博客 398

基因家族扩张收缩分析可视化(CAFE5)

CafePlotter 是一个用于可视化 CAFE5 基因家族扩张收缩分析结果的 Python 工具

xuzhougeng blog 3639

R语言机器学习算法实战系列(十三)随机森林生存分析构建预后模型 (Random Survival Forest)

本教程运用随机森林生存分析筛选与患者生存状态显著相关特征。该方法借随机森林这一强大机器学习算法,构建多棵决策树并集成结果,以提高生存分析准确性,识别关键生物标志物。接着,利用选定特征构建风险得分,将多个特征转化为单一数值,量化患者风险水平。之后,依据风险得分将患者分为高、低风险亚型,为临床治疗提供个性化指导。最后,通过分析时间依赖的 ROC 曲线评估模型长期预测能力。此曲线计算不同阈值下的真正例率与假正例率,在多个时间点评估,全面展现模型长期稳定性与准确性。

专注生信领域 2022

【Redis破障之路】一:强大的Redis

序-为什么要学Redis 和隔壁组的老哥聊天,老哥最近面了十几个候选人,他觉得合格的只有四五个。我问他主要问了什么?他重点提到了Redis。 提到这,他忍不住吐槽:“他们很多人Redis真的不行,问他们Redis主从、哨兵、集群什么的都答不上来。基本上就用过一些封装的api,也敢写熟悉。” 听到这,我也有点不好意思,这些东西我也不太清楚,我也只是个只会调api的crud仔,要是现在在他手下面试,基本会被挂掉吧。 而且Redis这东西还真的不是“造火箭”的范畴,这个老哥他们组的业务大量用到了Redis

m0_50180963的博客 79

OceanSim: 基于Isaac Sim GPU 加速水下机器人感知仿真框架

OceanSim 采用先进的基于物理的渲染技术,对水下视觉和声学传感器进行精确建模。与其他模拟引擎相比,OceanSim 的渲染速度要快得多。作为 NVIDIA Issac Sim 的扩展,OceanSim 采用了多功能设计。通过融入快速发展的 NVIDIA Omniverse 生态系统,我们的模拟器自然而然地在机器人学习和水下机器人技术之间架起了一座桥梁,从而促进了水下应用中体现型人工智能技术的开发和部署。OceanSim 将以开放源码的方式提供,使研究界能够以合作的模式作出贡献。

机器人控制与仿真应用 2051

分布式长连接 session 共享解决方案

websocket的 session 共享解决方案

ypw384556909的博客 1443

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

分布式常见面试题整理

对比Kafka(高吞吐但延迟高)、RabbitMQ(低延迟但吞吐低),RocketMQ平衡吞吐、延迟、事务消息、中文生态。容错与成本平衡:n节点集群容忍(n-1)/2个故障。吞吐量(Kafka/RocketMQ)、延迟(RabbitMQ)、可靠性、功能(事务/延迟消息)、生态和运维成本。支持临时节点和Watcher机制,服务注册(创建节点)、下线(节点自动删除)、发现(监听节点变化)实时通知。对CAP中一致性和可用性的权衡,强调基本可用(BA)、软状态(S)和最终一致性(E),适用于高可用场景。

2301_81193552的博客 1113

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

智慧判官-分布式编程评测平台

在线评测系统(Online Judge)起源于ACM国际大学生程序设计竞赛,现已发展成为编程教育、技术面试、技能评估的重要平台。随着数字化转型加速,企业对程序员的技术评估需求日益增长,在线OJ系统成为连接学习者、教育机构和企业的重要桥梁。市场分析教育市场:高校计算机课程实践平台、编程培训机构教学工具企业市场:技术面试筛选、内部技能评估、技术竞赛举办个人市场:编程爱好者技能提升、求职准备、技术交流用户画像服务契约设计// 服务接口定义 - 题目服务// 服务接口定义 - 用户服务。

2301_80418043的博客 1055

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Qwen3-4B-Instruct教程:AutoGen Studio中Agent分布式部署与跨节点消息同步

本文介绍了如何在星图GPU平台上自动化部署AutoGen Studio镜像,以构建分布式AI Agent系统。通过该平台,用户可以快速搭建基于Qwen3-4B-Instruct模型的智能体协作环境,实现跨服务器的Agent部署与消息同步,典型应用于构建需要分工协作的智能客服等复杂任务处理场景。

weixin_30476025的博客 32

Redis 版本演进、新特性与协议那些事儿

Redis 每个版本都有自己的脾气,有的适合稳扎稳打,有的适合尝鲜,有的为了适应 AI。扒一扒每个版本的核心变化、好玩的新命令、协议许可证的来龙去脉。另外,如果你是自己下载 Redis 源码编译、或者用 Docker 跑在服务器上,那后面提到的那些许可证问题——基本跟你没啥关系。协议限制主要针对的是云厂商把 Redis 打包成托管服务卖钱。你自己用,该咋用还咋用。1.x–2.x:打基础,数据结构 + Lua 脚本3.x–5.x:分布式 + 流消息6.x:多线程 I/O + ACL7.x。

代码构筑系统,架构驱动未来 —— 一名深耕 Java 技术的实践者 562

(六)从“缓存混乱难管控”到“Redis高效赋能”——Redis实战进阶指南

摘要:Java新手如何用Redis解决缓存乱象 本文针对Java后端新手在缓存使用中遇到的常见问题,如数据库压力过大、本地缓存不一致等,详细介绍了如何通过Redis实现高效缓存管理。内容涵盖: Redis基础:通过仓库与货架的类比,解释Redis作为内存数据库的核心优势 Spring Boot整合:提供三步配置方案(依赖添加、yml配置、序列化处理) 核心数据结构:介绍5种常用数据结构及其适用场景 实战技巧:包括连接池配置、序列化解决方案等 文章采用"问题驱动+场景化"的讲解方式,帮助开

修行者Java的博客 415

如何使用Redis实现消息队列?

当前使用较多的有RabbitMQRocketMQActiveMQKafkaZeroMQMetaMQ等,而部分如RedisMySQL以及phxsql,如果硬搞的话,其实也可实现消息队列的功能。可能有人觉得,各种开源的 MQ 已经足够使用了,但是有些简单的业务场景,可能不需要重量级的 MQ 组件(相比 Redis 来说,Kafka 和 RabbitMQ 都算是重量级的消息队列)那如何使用 Redis 实现消息队列呢?接下来我们一起来看。

程序员高级码农的博客 2744

Springboot3+Redis实现消息队列的多种方法

Springboot3+Redis实现消息队列的多种方法

qq_33999481的博客 1710
上一篇: 基于Redis实现分布式消息队列(2)
下一篇: 面向对象编程思想(OOP)
A心无旁骛
博客等级 码龄9年 35粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值