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())