接收订单用redis做缓存好还是rabbit做消息队列好

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接收订单用redis做缓存好还是rabbit做消息队列好相关的知识,希望对你有一定的参考价值。

具体对比

可靠消费
Redis:没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理
RabbitMQ:具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费
可靠发布
Reids:不提供,需自行实现
RabbitMQ:具有发布确认功能,保证消息被发布到服务器
高可用
Redis:采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案
RabbitMQ:集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作
持久化
Redis:将整个Redis实例持久化到磁盘
RabbitMQ:队列,消息,都可以选择是否持久化
消费者负载均衡
Redis:不提供,需自行实现
RabbitMQ:根据消费者情况,进行消息的均衡分发
队列监控
Redis:不提供,需自行实现
RabbitMQ:后台可以监控某个队列的所有信息,(内存,磁盘,消费者,生产者,速率等)
流量控制
Redis:不提供,需自行实现
RabbitMQ:服务器过载的情况,对生产者速率会进行限制,保证服务可靠性
出入队性能
对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。
测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。
参考技术A redis消息推送(基于分布式pub/sub)多用于实时性较高的消息推送,并不保证可靠。其他的mq和kafka保证可靠但有一些延迟(非实时系统没有保证延迟)。redis-pub/sub断电就清空,而使用redis-list作为消息推送虽然有持久化,但是又太弱智,也

如何使用Redis 做队列操作

    redis设计用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列,它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列;

    另外,做消息队列的其他特性例如FIFO(先入先出)也很容易实现,只需要一个list对象从头取数据,从尾部塞数据即可;

    redis能做消息队列还得益于其list对象blpop brpop接口以及Pub/Sub(发布/订阅)的某些接口,它们都是阻塞版的,所以可以用来做消息队列。

参考技术A 入队列操作文件 list_push.php

<?php
$redis = getRedisInstance();//从Redis服务器拿到redis实例
$redis->connect('Redis服务器IP', 6379);
while (true)
$redis->lPush('list1', 'A_'.date('Y-m-d H:i:s'));
sleep(rand()%3);

?>

执行# php list_push.php &

出队列操作 list_pop.php文件
<?php
$redis = getRedisInstance();//从Redis服务器拿到redis实例
$redis->pconnect('Redis服务器IP', 6379);
while(true)
try
var_export( $redis->blPop('list1', 10) );
catch(Exception $e)
//echo $e;




实现方法(Python)

1.入队列(write.py)

#!/usr/bin/env python

import time

from redis import Redis

redis = Redis(host='127.0.0.1', port=6379)

while True:

now = time.strftime("%Y/%m/%d %H:%M:%S")

redis.lpush('test_queue', now)

time.sleep(1)

2.出队列(read.py)

#!/usr/bin/env python

import sys

from redis import Redis

redis = Redis(host='127.0.0.1', port=6379)

while True:

res = redis.rpop('test_queue')

if res == None:

pass

else:

print str(res)本回答被提问者采纳

以上是关于接收订单用redis做缓存好还是rabbit做消息队列好的主要内容,如果未能解决你的问题,请参考以下文章

订单并发5000的排队机制

如何使用REDIS做限定登录和LIST缓存?

12. Redis中的消息队列

rabbit mq 手动重试机制

使用redis做mybaties的二级缓存-Mybatis 二级缓存小心使用

Redis做持久化储存和用mysql那个更快