• 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())  
    
  • 相关阅读:
    免费音频录制及处理软件 Audacity
    centos7设置程序开机启动方案
    tomcat开启前或者关闭前执行清理任务 servlet基础知识解决
    BigDecimal比较大小及判0处理
    File文件夹操作创建层级文件夹
    centos7设置activemq开机启动
    tomcat关闭时无法清理资源解决方案
    java数据类型和C++的对应关系 SDK开发
    centos7查询开机启动项及设置服务为开机自启动
    Entity Framework 教程
  • 原文地址:https://www.cnblogs.com/pythonwl/p/16313712.html
Copyright © 2020-2023  润新知