Redis是一个高性能的key-value数据库,它的出现很大程度补偿了memcached这类key-value存储的不足。虽然它是一个数据库系统,但本身支持MQ功能,完全可以当做一个轻量级的队列服务器使用。

不过,Redis只是提供一个高性能的、原子操作内存键值队,具有高速访问能力,虽可用做消息队列的存储,但是不具备消息队列的任何功能和逻辑,要作做为消息队列来实现的话,功能和逻辑要通过上层应用自己实现。

Redis从2.0版本开始支持发布/订阅指令,发布者调用redis的publish方法往特定的channel发送消息,订阅者在初始化的时候要订阅到该channel,一旦有消息就会立即接收。

Redis 消息推送(基于分布式 pub/sub)多用于实时性较高的消息推送,并不保证可靠。redis-pub/sub断电就清空,而使用redis-list作为消息推送虽然有持久化,但是也并非完全可靠不会丢。其他的mq和kafka保证可靠但有一些延迟(非实时系统没有保证延迟)。
  另外一点,redis 发布订阅除了表示不同的 topic 外,并不支持分组。但kafka是支持分组的,比如kafka中发布一个东西,多个订阅者可以分组,同一个组里只有一个订阅者会收到该消息,而这个可以用作负载均衡。

Redis发布订阅与rabbitmq的区别

  1. 可靠性

redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中;

rabbitmq:具有消息消费确认机制,如果发布一条消息,还没有消费者消费该队列,那么这条消息将一直存放在队列中,直到有消费者消费了该条消息,以此可以保证消息的可靠消费。

  1. 实时性

redis:实时性高,redis作为高效的缓存服务器,所有数据都存在内存中,所以它具有更高的实时性

  1. 消费者负载均衡:

rabbitmq队列可以被多个消费者同时监控消费,但是每一条消息只能被消费一次,由于rabbitmq的消费确认机制,因此它能够根据消费者的消费能力而调整它的负载;

redis发布订阅模式,一个队列可以被多个消费者同时订阅,当有消息到达时,会将该消息依次发送给每个订阅者,她是一种消息的广播形式,redis本身不做消费者的负载均衡,因此消费效率存在瓶颈;

  1. 持久性

redis:redis的持久化是针对于整个redis缓存的内容,它有RDB和AOF两种持久化方式(redis持久化方式,后续更新),可以将整个redis实例持久化到磁盘,以此来做数据备份,防止异常情况下导致数据丢失。

rabbitmq:队列,每条消息都可以选择性持久化,持久化粒度更小,更灵活;

  1. 队列监控

rabbitmq实现了后台监控平台,可以在该平台上看到所有创建的队列的详细情况,良好的后台管理平台可以方面我们更好的使用;

redis没有所谓的监控平台。

  1. 性能

性能上,对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

总结

redis: 轻量级,低延迟,高并发,低可靠性;

rabbitmq:重量级,高可靠,异步,不保证实时;

rabbitmq是一个专门的AMQP协议队列,他的优势就在于提供可靠的队列服务,并且可做到异步,而redis主要是用于缓存的,redis的发布订阅模块,可用于实现及时性,且可靠性低的功能。

Redis发布订阅与ActiveMQ的比较
  1. ActiveMQ支持多种消息协议,包括AMQP,MQTT,Stomp等,并且支持JMS规范,但Redis没有提供对这些协议的支持;

2. ActiveMQ提供持久化功能,但Redis无法对消息持久化存储,一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;

3. ActiveMQ提供了消息传输保障,当客户端连接超时或事务回滚等情况发生时,消息会被重新发送给客户端,Redis没有提供消息传输保障。

总之,ActiveMQ所提供的功能远比Redis发布订阅要复杂,毕竟Redis不是专门做发布订阅的。但是如果系统中已经有了Redis,并且只需要基本的发布订阅功能,可以考虑使用Redis的发布订阅机制以满足需求。

Redis 与 MQ 的区别相关推荐

  1. 常用服务的集群搭建(redis、MQ、es、zookerper)

    常用服务的集群搭建(redis.MQ.es.zookerper) 1.集群概述 1.1什么是集群 1.1.1集群概念 集群是一种计算机系统, 它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地 ...

  2. ibm linux mq 发送消息_RabbitMq、ActiveMq、Kafka和Redis做Mq对比

    一.RabbitMq RabbitMQ是一个Advanced Message Queuing Protocol(AMQP)的开源实现,由以高性能.可伸缩性出名的Erlang写成.RabbitMQ Se ...

  3. redis和Memcached的区别,都什么时候使用?

    redis和Memcached的区别,都什么时候使用? 缓存在互联网公司占得比例还是蛮大的,提到缓存呢,就一定会想到redis和memcache,现在绝大多数的公司呢,都是推荐使用redis,这是为什 ...

  4. redis之mq实现发布订阅模式

    https://github.com/smltq/spring-boot-demo/blob/master/mq-redis 概述 Redis不仅可作为缓存服务器,还可用作消息队列,本示例演示如何使用 ...

  5. redis和memcached的区别(总结)

    来源:https://www.cnblogs.com/457248499-qq-com/p/7392653.html  redis和memcached的区别(总结) 观点一: 1.Redis和Memc ...

  6. mysql 迭代更新_MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)

    MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...

  7. java队列_RPC远程调用和消息队列MQ的区别

    RPC和MQ同样都是用于分布式系统的两个很重要的技术,都有服务提供者.消费者的概念,可在一定程度上对系统进行解耦.但两者之间还是有区别的,本篇简单介绍~ 一.RPC RPC(Remote Proced ...

  8. Redis与Memocache的区别

    转载地址:http://gnucto.blog.51cto.com/3391516/998509 Redis与Memcached的区别 传统MySQL+ Memcached架构遇到的问题 实际MySQ ...

  9. 详解RPC远程调用和消息队列MQ的区别

    谈到分布式架构,就不得不谈到分布式架构的基石RPC. 什么是RPC RPC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC服 ...

最新文章

  1. Linux 常用小技巧
  2. 怎样设定手机或平板让它更安全?
  3. 博士申请 | 荷兰代尔夫特理工大学陶倩教授招收医学人工智能全奖博士生
  4. 你能体会那种写 Python 时不用 import 的幸福吗?
  5. Iterator to list的三种方法
  6. ACCESS 文本文件导入和导出指定字段类型的方法
  7. mysql主从复制之异常解决--- Slave_IO_Running: NO
  8. BugkuCTF-Crypto题简单加密
  9. 今天二月二龙抬头:除了理发 各地还有哪些习俗?
  10. 文本数据挖掘实验:文本分类
  11. 什么是Python爬虫?一篇文章带你全面了解爬虫
  12. 【深度】“考上北大,我们也和那几亿的农民工人互为镜像”
  13. mongodb的分组求和(使用aggregate方法)
  14. nmap命令小结(一)
  15. MMC5603NJ地磁传感器(指南针示例)
  16. canvas中如何设置渐变色
  17. 经典 90 坦克大战 Python 版实现(支持单双人模式)
  18. TP-LINK wn822n USB型无线网卡win10环境下驱动程序
  19. 什么是敏捷性能合弄结构(APH)?
  20. DFS - leetcode-岛屿问题(合集)

热门文章

  1. 62. Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 (二分查找-局部有序)
  2. Leetcode 142. 环形链表 II (每日一题 20210902)
  3. 342. Power of Four
  4. web浏览器录音:web audio api
  5. 定位系列论文:基于行为识别的楼层定位(二):Research on HAR-Based Floor Positioning
  6. 论文笔记:N-BEATS: NEURAL BASIS EXPANSION ANALYSIS FORINTERPRETABLE TIME SERIES FORECASTING
  7. 报错整理:ImportError: cannot import name ‘mean_absolute_percentage_error‘ from ‘sklearn.metrics‘
  8. pytorch 笔记 :实现Dropout
  9. 产品经理必备知识之网页设计系列(二)-如何设计出一个优秀的界面
  10. Python 模块学习 logging(2)