python实现redis5.0.8 流操作

作者:lizhonglin
github: https://github.com/Leezhonglin/
blog: https://leezhonglin.github.io

这段时间需要用到消息队列,查询了python有通过Celery来实现,但是遇到分布式的时候连接redis集群时.使用Celery会出现不能连接的问题.找了很多redis连接库,多多少少有各种问题. 最后了解到redis的流.完美的解决这个问题.一下是基本的实现.

#!/usr/bin/python
# -*- coding: UTF-8 -*
"""
@file_name: stream.py
@author:li-boss
@create date: 2020/07/28 15:40
@description:redis流操作
"""
import uuid

class Stream():
    """
    redis流
    """
    def __init__(self,stream_name='TASK_QUEUE',group_name = 'QUEUE'):

        self.db = redis_client.get_conn()
        self.stream = stream_name
        self.add_stream(self.stream)
        if not self.is_active_group(self.stream,group_name):
            self.db.xgroup_create(self.stream, group_name, id=0)


    def is_active_group(self,stream_name,group_name):
        """
        验证是否有组
        :param stream_name:
        :param group_name:
        :return:
        """
        infos = self.db.xinfo_groups(stream_name)
        for item in infos:
            if item.get('name').decode()==group_name:
                return True
        return False

    def add_stream(self,stream_name):
        """
        添加流
        :param stream_name:
        :return:
        """
        if not self.db.exists(stream_name):
            id = self.db.xadd(stream_name, {'test': 'test'})
            self.db.xdel(stream_name, id)
        return

    def add_msg(self,msg):
        """
        添加消息
        :param msg:
        :return:
        """
        return self.db.xadd(self.stream,msg)

    def del_msg(self,msg_id):
        """
        删除消息
        :param msg_id:
        :return:
        """
        return self.db.xdel(self.stream,msg_id)

    def get_stream_len(self):
        """
        获取流的长度
        :return:
        """
        return self.db.xlen(self.stream)

    def get_stream_list(self):

        return self.db.xrange(self.stream)


class streamClient():
    """
    流客户端
    """
    def __init__(self,stream_name='TASK_QUEUE',group_name = 'QUEUE'):
        self.db = redis_client.get_conn()
        self.stream_name = stream_name
        self.group = group_name
        self.consumer_name ='user'+ str(uuid.uuid1())


    def read_group(self, block=0):
        """
        消费
        :param block: block=0表示阻塞1,表示非阻塞
        :return:
        """
        return self.r.xreadgroup(self.group_name, self.customer, {self.stream_name: ">"}, count=1, block=block)

以上是自己总结的redis流操作,希望能帮助到大家.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kujirashark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值