python使用redis实现小型的消息队列

利用redis 的list数据结构,你可以将redis当做一个小的消息队列来使用

list 结构支持生产者向队列里压入消息,消费者从队列里拉取数据,生产者与消费者的数量没有限制,消息只能被消费一次。

下面实现一个生产者

import time
from redis.client import Redis

r = Redis(host='127.0.0.1', port=6379, db=0, password='password')

def producer():
    for i in range(10):
        r.lpush('int_queue', i)
        time.sleep(1)

if __name__ == '__main__':
    producer()

生产者每隔1秒钟就向队列里写入一条数据,下面来看消费者的代码

import time
from redis.client import Redis

r = Redis(host='127.0.0.1', port=6379, db=0, password='password')

def consumer():
    while True:
        data = r.rpop('int_queue')
        if data is None:
            time.sleep(0.5)
            continue

        print(data)   # 消费数据

if __name__ == '__main__':
    consumer()

消费者通常要使用while循环不停的尝试从队列里取数据,生产者是从左侧将数据写入队列的,那么消费者就应当从右侧拉取数据,最先被压入的数据理应被先消费。

如果队列是空的,rpop 方法会返回None,队列目前只是暂时为空,因此不能退出循环,sleep一段时间后再次尝试拉取数据。

成熟的消息队列有kakfa, rabbitmq, redis做消息队列其实有点摆不上台面,但胜在简单小巧,一些小的项目,也实在没必要配套一个kafka,毕竟搭建和维护都是需要时间的,而redis在应对少量消息时足够用了。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案