前段时间工作中遇到一个问题,需要提供给前端一个进度信息展示的接口,一直的思路是将信息数据放redis中,当每次请求的时候从redis中取出来,更新后再放回redis中,并且将此次的数据返回给前端。但是有一个问题推翻了这种思路,当数据量过大时、或者获取某一数据耗时过长时,前端会间隔几秒就来请求接口,但是数据来不及返回,前端就会报错。
进度引擎
为解决上述问题,提出进度引擎方案。进度引擎需要实现的功能是:需要监听信号,当接收到start信号后,开始从redis中lrange获取列表中相应键的值信息,然后请求数据进行填充,当数据填充结束后lset / rpush进去更新redis中原有的数据信息即可。当接收到stop、restart、pause、resume等信号时,采取相应的措施即可。
给前端提供数据的接口每次只用去获取redis中的数据信息即可。
这样避免了在一个接口中既要请求数据又要返回数据,还常常因为数据量大、返回速度慢等原因造成的报错问题。
从redis中获取list类型的键值信息接口:
def load_plan_id(p_id): ####planState_
#msg = redis_strict.lpop("planState_"+str(p_id))#在"planState_"+str(p_id)对应列表的左侧获取第一个元素并在列表中删除 返回值是第一个元素
msg = redis_strict.lrange("planState_"+str(p_id),0,0) #在"planState_"+str(p_id)
#print 'lrange 获取的msg结果展示:',msg
if msg:
try:
c_p = json.loads(msg[0])
return c_p
except:
return {}
else:
return {}
向redis中更新list类型的键值信息接口:
def push_plan_id(p_id,new_p):
msg = json.dumps(new_p)
msg1 = redis_strict.lrange("planState_"+str(p_id),0,0)
if msg1:
flg = redis_strict.lset("planState_"+str(p_id),0,msg)
else:
flg = redis_strict.rpush("planState_"+str(p_id),msg)