Redis —— stream 队列使用

import redis


# 拿到一个redis的连接池
# decode_responses:自动解码,socket_timeout:得不到redis的数据超市就报错,防止卡住,很重要!!!
Redis_Pool = redis.ConnectionPool(host=redis_host, port=redis_port,db=redis_db, username=None, password=redis_password, max_connections=10, decode_responses=True, socket_timeout=15)

# stream 队列使用

def check_url_redis_task():
    """存入数据"""
    # stream_name 相当于队列名称
    stream_name = 'url_data'

    while True:
        try:
            # 从链接池获取一个链接
            REDIS_CLI = redis.Redis(connection_pool=Redis_Pool, decode_responses=True)

            data = [1,2,3]
            for d in data:
                # 添加数据到 stream                
                REDIS_CLI.xadd(stream_name, d)
                logger.info('已添加数据:{}'.format(d))

        except Exception:
            logger.warning(traceback.format_exc())

def get_url_redis_task():
    """获取数据"""

    stream_name = 'url_result'

    # 用户组:对一个 stream 数据的读取,
    # 不同组之间的成员是互不干涉的,都能读到所有数据
    # 同一个组内的成员之间读取数据是竞争的关系,抢数据处理

    group_name = 'group_apt'

    try:
        # 从链接池获取一个链接
        REDIS_CLI = redis.Redis(connection_pool=Redis_Pool, decode_responses=True)

        try:
            # 0 从开始消费, $ 从尾部消费,mkstream 创建空用户组,保证用户组存在
            REDIS_CLI.xgroup_create(stream_name, group_name, id=0, mkstream=True)
        except Exception as e:
            print(e)

        while True:
            try:
                REDIS_CLI = redis.Redis(connection_pool=Redis_Pool, decode_responses=True)
                # 获取没给同组内其他成员的数据
                consumer_id = '>'
                # block 0 时阻塞等待, 其他数值表示读取超时时间,单位:毫秒
                # count 读取的数量
                try:
                    block_time = 10000
                    items = REDIS_CLI.xreadgroup(group_name, 'consumer_name', {stream_name: consumer_id}, block=block_time, count=100)  
                except Exception as e:
                    logger.info('获取数据结果报错')
                    logger.info(traceback.format_exc())
                    time.sleep(1)
                    continue

                for id, fields in items[0][1]:
                    try:
                        # 处理获取的数据
                        pass
                    except Exception as e:
                        logger.warning(traceback.format_exc())
                    # 告诉 stream 已经读取了这个数据
                    REDIS_CLI.xack(stream_name, group_name, id)
                    
            except Exception as e:
                print(e)
                time.sleep(1)

    except Exception:
        logger.warning(traceback.format_exc())  
posted @ 2022-05-26 15:42  pythoner_wl  阅读(334)  评论(0编辑  收藏  举报