redis集群与rabbitmq集群

本文深入探讨Redis集群的哨兵模式与分片原理,以及RabbitMQ集群的erlang cookie同步机制和消息路由策略,揭示两者在互联网项目中的核心作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

互联网项目中,redis和mq几乎成标配,开源的rabbitmq更加受欢迎,以下记录下相关原理,哪天忘记了 来瞅一眼

 

redis集群指官方推荐集群方式,最少部署6个节点,会自动进行分片,副本集群。6个节点时,会分3个片,每个片一个副本。

 

为啥要分3个片呢?----redis集群采用的是哨兵模式,网上文章很多,我这一句话总结:哨兵负责主从之间报信 和选举(低于3个哨兵的投票没有任何意义)。

如果发现主节点 或者从节点有异常,大家马上就知道了。从节点有异常就标记一下,主节点有异常就比较麻烦了,要重新选取新的主节点。(主节点是否挂掉,由哨兵们选举决定,过半的人觉得他挂了,嗯。。他就挂了)。

选择为主节点后,会告诉所有从节点,XX成主节点了,xx成从节点了,并将XX的所有数据都同步到xx中。然后转换完成。

那redis是如何写到不同的主节点的,嗯,他采取了CRC16算法,总的来说会出现2^16次方个值,但基于节省空间的原则,作者选了存储量在20k的2^14次方16384个槽。有N个主节点,算出来的槽在(16384/N)哪个区间内,然后进行读写。嗯,就是分库分表的原理。

 

rabbitmq集群------采用erlang特性 cookie同步,将对应的.erlang.cookie值设置为相同即可,他们之间的信息就会相互copy。嗯,在我看来就是文件共享。这样所有的节点都是水平分布的,那又是如何确定写入不同的主节点呢

 

rabbitmq通常需要装一个插件HAProxy代理,性能巨好,通过rabbion算法分配,当然也可以自己定义。当然,使用你ngxin、F5等等都是OK的,只要能扛得住流量

 

### Redis 消息队列 RabbitMQ 的使用场景性能对比 #### 功能复杂度 RabbitMQ 提供了丰富的功能集,包括复杂的路由规则、死信队列以及延迟队列等功能。这些特性使得它非常适合需要高度定制化的消息传递场景[^2]。相比之下,Redis 的消息队列功能较为基础,主要依赖其发布订阅模型或者列表数据结构来实现简单的消息队列功能。 #### 性能表现 在高吞吐量和低延迟的要求下,Redis 表现出色。由于 Redis 将所有数据存储在内存中并支持高效的读写操作,因此它的速度通常优于 RabbitMQ[^3]。然而,在面对大规模消息堆积的情况下,Redis 的内存消耗会显著增加,可能导致性能下降甚至崩溃[^2]。 #### 部署维护 RabbitMQ 的部署过程相对繁琐,涉及多个方面的考量,比如集群搭建、数据持久化策略制定及后续的性能优化等工作,这无疑提高了系统的运维门槛[^2]。此同时,为了充分发挥 RabbitMQ 的潜力,开发者还需掌握 AMQP 协议及其内部工作机制等相关知识[^4]。此相反的是,基于 Redis 构建的消息队列则显得更加轻便快捷,易于集成到现有的应用程序当中去[^3]。 #### 数据可靠性 尽管 Redis 支持 AOF (Append Only File) 或 RDB (Redis Database Backup) 这样的持久化方式以保障数据安全,但是在某些极端条件下(例如突然断电),仍有可能造成少量的数据损失;再加上其 Pub/Sub 不具备任何形式上的确认机制,这意味着如果订阅端未能及时接收信息,则该条目极有可能永久遗失[^2]。另一方面,得益于 Erlang 编程语言天生优秀的容错能力和内置事务管理器的帮助,即使遭遇突发状况,RabbitMQ 也能较好地保护未被成功投递出去的信息免受损害[^4]。 ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='hello') def callback(ch, method, properties, body): print(f"Received {body}") channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True) print('Waiting for messages.') channel.start_consuming() ``` 以上是一个利用 Python 库 `pika` 来连接 RabbitMQ 并消费消息的例子。 ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) pubsub = r.pubsub() pubsub.subscribe(['test-channel']) for message in pubsub.listen(): if message['type'] == 'message': print(message['data']) ``` 这是另一个采用 Python 官方推荐库 `redis-py` 实现监听来自指定频道广播事件的功能片段。 #### 结论 综上所述,当项目需求侧重于简化架构设计同时追求极致效率时可优先选用 Redis;而对于那些期望获得更全面解决方案的企业级应用而言,或许 RabbitMQ 才是最理想的选择[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值