在redis
中维护库存,使用原子加减操做,能够避免高并发致使的库存不足、超卖等异常。redis
这里提供一个Lua
脚本,在保证原子性操做的同时,记录库存操做的新旧值:并发
local stock = tonumber(redis.call('get', KEYS[1]));
local delta = tonumber(ARGV[1]);
if (stock + delta < 0) then
return '';
end;
return string.format('%d,%d', stock, redis.call('incrby', KEYS[1], delta));
复制代码
该脚本会先根据key查询当前库存,而后执行变量的数量操做,并不会真正改变redis的值。若是操做结果为负,返回空,不然执行原子加减,并返回当前库存和操做后库存。高并发
举个例子:ui
输入参数是库存对应的key,和所要加减的数量,例如:GOODS_425,-10,lua
表示对GOODS_425的库存减10。spa
返回是一个字符串,若是为空表示当次操做会使库存变为负数,应提示用户从新操做。code
正常操做会返回库存操做新旧值,中间以逗号隔开,"125,105"
。orm