RabbitMQ

RabbitMQ:官方网址:http://www.rabbitmq.com/

Install Erlang

# rpm -ivh erlang-18.3-1.el6.x86_64.rpm 

Install RabbitMQ Server

rpm -ivh rabbitmq-server-3.6.2-1.noarch.rpm

1、Hello World!

生产者

import pika

credentials = pika.PlainCredentials('guest', 'guest')  # 使用用户名密码进行验证
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='192.168.33.35', port=5672, credentials=credentials))
channel = connection.channel() # 声明一个通道 channel.queue_declare(queue='test.queue') # 声明一个queue
channel.basic_publish(exchange='', routing_key='test.queue', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

消费者

import pika

credentials = pika.PlainCredentials('guest', 'guest')  # 使用用户名密码进行验证
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='192.168.33.35', port=5672, credentials=credentials)) channel = connection.channel() channel.queue_declare(queue='test.queue') def callback(ch, method, properties, body):
print(" [x] Received %r" % body) channel.basic_consume(callback, queue='test.queue', no_ack=True) # callback如果收到消息就调用callback函数处理消息
# no_ack=True 指客户端处理完消息后,不跟服务器进行确认,这个参数在生成一定不能是用 channel.basic_qos(prefetch_count=1) # 设置接收端控制消息处理机制
print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()

acknowledgments

Message acknowledgments are turned on by default,在前面的代码内,我们为了举例,no_ack=True,这个参数在生产环境强烈建议去掉。

下面展示一段消费者代码:

import pika

credentials = pika.PlainCredentials('guest', 'guest')  # 使用用户名密码进行验证
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='192.168.33.35', port=5672, credentials=credentials)) channel = connection.channel() channel.queue_declare(queue='test.queue', durable=True) def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
ch.basic_ack(delivery_tag=method.delivery_tag) # 代表告诉消息服务器我处理完毕,你可以把消息删除了 channel.basic_consume(callback, queue='test.queue') # callback如果收到消息就调用callback函数处理消息 channel.basic_qos(prefetch_count=1) # 设置接收端控制消息处理机制
print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()

消息的持久化

First, we need to make sure that RabbitMQ will never lose our queue. In order to do so, we need to declare it as durable:

channel.queue_declare(queue='hello', durable=True)

This queue_declare change needs to be applied to both the producer and consumer code.

Now we need to mark our messages as persistent - by supplying a delivery_mode property with a value 2.

channel.basic_publish(exchange='',
routing_key="task_queue",
body=message,
properties=pika.BasicProperties(
delivery_mode = 2, # make message persistent
))

例1:

import pika

credentials = pika.PlainCredentials('guest', 'guest')  # 使用用户名密码进行验证
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='192.168.33.35', port=5672, credentials=credentials))
channel = connection.channel() # 声明一个通道 channel.queue_declare(queue='test.queue', durable=True) # 声明一个queue
properties = pika.BasicProperties(delivery_mode=2) # 消息持久化
channel.basic_publish(exchange='', routing_key='test.queue', body='Hello World!', properties=properties)
print(" [x] Sent 'Hello World!'")
connection.close()

消息发布\订阅

Exchange在定义的时候是有类型的,以决定到底是哪些Queue符合条件,可以接收消息

fanout: 所有bind到此exchange的queue都可以接收消息
direct: 通过routingKey和exchange决定的那个唯一的queue可以接收消息
topic:所有符合routingKey(此时可以是一个表达式)的routingKey所bind的queue可以接收消息

注意:消息不会存在Exchange里面。

exchange type=fanout

生产者:

import pika
import sys credentials = pika.PlainCredentials('guest', 'guest') # 使用用户名密码进行验证
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='192.168.33.35', port=5672, credentials=credentials))
channel = connection.channel() channel.exchange_declare(exchange='logs', type='fanout', durable=True) message = ' '.join(sys.argv[1:]) or "info: Hello Worlcccc!" channel.basic_publish(exchange='logs', routing_key='', body=message)
print(" [x] Sent %r" % message)
connection.close()

消费者:

import pika

credentials = pika.PlainCredentials('guest', 'guest')  # 使用用户名密码进行验证
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='192.168.33.35', port=5672, credentials=credentials))
channel = connection.channel() channel.exchange_declare(exchange='logs', type='fanout', durable=True) result = channel.queue_declare(exclusive=True) # 不指定queue名字,rabbit会随机分配一个名字,exclusive=True会在使用此queue的消费者断开后,自动将queue删除
queue_name = result.method.queue channel.queue_bind(exchange='logs', queue=queue_name) print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch, method, properties, body):
print(" [x] %r" % body) channel.basic_consume(callback, queue=queue_name)
channel.start_consuming()

exchange type=direct

RabbitMQ还支持根据关键字发送,即:队列绑定关键字,发送者将数据根据关键字发送到消息exchange,exchange根据 关键字 判定应该将数据发送至指定队列。

生产者

import pika
import sys credentials = pika.PlainCredentials('guest', 'guest')
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='192.168.33.35', port=5672, credentials=credentials))
channel = connection.channel() channel.exchange_declare(exchange='direct_logs', type='direct') severity = sys.argv[1] if len(sys.argv) > 1 else 'info' message = ' '.join(sys.argv[2:]) or 'Hello World!' channel.basic_publish(exchange='direct_logs', routing_key=severity, body=message)
print(" [x] Sent %r:%r" % (severity, message))
connection.close()

消费者

import pika
import sys credentials = pika.PlainCredentials('guest', 'guest')
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='192.168.33.35', port=5672, credentials=credentials))
channel = connection.channel() channel.exchange_declare(exchange='direct_logs', type='direct') result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue severities = sys.argv[1:]
if not severities:
sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
sys.exit(1) for severity in severities:
channel.queue_bind(exchange='direct_logs', queue=queue_name, routing_key=severity) print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body)) channel.basic_consume(callback, queue=queue_name) channel.start_consuming()

exchange type=topic

生产者:

消费者:

#:代表接收所有消息

Remote procedure call (RPC)

RabbitMQ常用命令:

列出所有queue,The default value is "/"

1、rabbitmqctl list_queues

修改用户的密码

2、change_password <username> <newpassword>

Redis

Redis是缓存数据库,

import redis

r = redis.Redis(host='192.168.33.35', port=6379)
r.set('foo', 'Bar')
print(r.get('foo'))

连接池方式:

import redis

pool = redis.ConnectionPool(host='192.168.33.35', port=6379)

r = redis.Redis(connection_pool=pool)
r.set('foo', 'Bar')
print(r.get('foo'))

set(name, value, ex=None, px=None, nx=False, xx=False)

在Redis中设置值,默认,不存在则创建,存在则修改

参数:
     ex,过期时间(秒)
     px,过期时间(毫秒)
     nx,如果设置为True,则只有name不存在时,当前set操作才执行
     xx,如果设置为True,则只有name存在时,岗前set操作才执行

Redis常用命令介绍

RabbitMQ、Rdis的更多相关文章

  1. Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能-转自阿里中间件

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...

  2. Python操作Redis、Memcache、RabbitMQ、SQLAlchemy

    Python操作 Redis.Memcache.RabbitMQ.SQLAlchemy redis介绍:redis是一个开源的,先进的KEY-VALUE存储,它通常被称为数据结构服务器,因为键可以包含 ...

  3. RabbitMq、ActiveMq、ZeroMq 和 kafka 比较

    MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ之间的对比数据和资料.第一部分 ...

  4. RabbitMQ、ActiveMQ和ZeroMQ

    消息中间件的技术选型心得-RabbitMQ.ActiveMQ和ZeroMQ 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs RabbitMQ.Active ...

  5. 消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ

    消息中间件的技术选型心得-RabbitMQ.ActiveMQ和ZeroMQ 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs RabbitMQ.Active ...

  6. Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy   Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...

  7. (转)消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ

    RabbitMQ.ActiveMQ和ZeroMQ都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?很多开发者面临这个烦恼.下面我会对这三个消息中间件做一个比较,看了后你们就心中有数了. Rab ...

  8. Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理

    为什么使用消息队列 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务 ...

  9. 消息队列RabbitMq、ActiveMq、ZeroMq、kafka之间的比较

    MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ之间的对比数据和资料. 第一部 ...

随机推荐

  1. #include <vector>用法之我见

    vector是一种顺序容器,事实上和数组差不多,但它比数组更优越.一般来说数组不能动态拓展,(何为动态拓展,即是说如果你知道你要存的数据的个数,你定义的存储数据的数组大小也就决定了,但是若你事先不知道 ...

  2. 判断是否存在哈密顿路--HDU 5424

    题意:给一张无向图,判断是否是哈密顿图. 哈密顿路:经过每个点有且仅有一次的一条通路. 方法:每次找度数最小的点作为起点,然后dfs整个图,看能遍历到的点的数目能否达到n. #include<i ...

  3. mysql多种备份方式比较及实现

    Mysql备份 MySQL的备份和还原: 备份:存放为副本-->数据备份 RAID1,RAID10:保证硬件损坏而不会业务中止,不能保证逻辑上的损害 例如:DROP TABLE mydb.tb1 ...

  4. mmzb游戏事故分析

    最近一次线上更新,老项目挂了,遍地哀嚎,日活跃掉了好多,心痛... 这次维护时,SA为了缩减硬件资源,做了一次数据库迁移.给到开发手上的player db,只有一些索引数据,不带有任一玩家数据.玩家上 ...

  5. Python 程序员经常犯的 10 个错误

    关于PythonPython是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得... 关于Python Python是一种解释性.面向对 ...

  6. SQL---Chapter01 数据库和SQL

    数据库类型: 层次数据库(Hierarchical Database, HDB) 数据通过层次结构(树形结构)的方式表示出来. 关系型数据库(Relational Database, RDB) 使用专 ...

  7. 2015.10.15class

    #include<stdio.h> main() { int a; printf("你的智商是多少?\n"); scanf("%d",&a) ...

  8. 《Android深度探索HAL与驱动开发》第二章阅读心得

    按照书中所讲的步骤,第一步先准备好搭建Android开发环境所需要的工具:JDK6或以上版本:Eclipse3.4或以上版本:ADT:CDT:Android SDK:Android NDK;交叉编译环 ...

  9. Ubuntu下安装boost

    今天开始安装配置Ubuntu开发环境(Ubuntu 12.04).在干活之前就预计到会遇到很多问题,但是没想到一开始就卡壳,可能是linux中各种包的依赖关系太复杂了,决定写个帖子记录一下,免得以后再 ...

  10. DNS学习笔记之DNS理论知识

    DNS: Domain Name System (将域名和ip地址相互转化) 域名是一个范围,例如baidu.com,.com.而www.baidu.com是个主机名,即FQDN: Full Qual ...