【发布时间】:2015-11-14 03:49:39
【问题描述】:
假设food_dict 是dictionary 将商品存放在购物车中,
{<food_id>:<count>}
(一个购物车可能包含多种食物)
我已经提前将food存储在redis中:
r.hset('food:<food_id>', {'price': <price>, 'stock': <stock>})
在对cart下订单时,我必须确保stock大于count。
基本工具:
for k,v in food_dict.iteritems():
_stock = int(redis_db.hget('food:' + str(k), 'stock'))
if v > _stock:
# I have to rollback the decrement of stock
break
else:
redis_db.hset('food:' + str(k), 'stock', _stock - v)
需要rollback,pipeline。
pipe = redis_db.pipeline()
for k, v in food_dict.iteritems():
_stock = int(redis_db.hget('food:' + str(k), 'stock'))
if v > _stock:
return
else:
pipe.hset('food:' + str(k), 'stock', _stock - v)
pipe.execute()
对于单个客户端,上面的代码可以做得很好。在并发方面:
with redis_db.pipleline() as pipe:
while 1:
try:
pipe.watch(['food:' + str(k) for k in food_dict])
stock_dict = {}
for k in food_dict:
_stock = pipe.hget('food:' + str(k), 'stock')
stock_dict[k] = _stock
pipe.multi()
for k, v in food_dict.iteritems():
if v > stock_dict[k]:
break
else:
pipe.hset('food:' + str(k), 'stock', stock_dict[k] - v)
pipe.execute()
break
except WathchError:
continue
finally:
pipe.reset()
此代码能否保证只有当库存大于数量时才能下订单?
【问题讨论】:
标签: python concurrency transactions redis