在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的值。如果操作结果为负,返回空,否则执行原子加减,并返回当前库存和操作后库存。
举个例子:
输入参数是库存对应的key,和所要加减的数量,例如:GOODS_425,-10,
表示对GOODS_425的库存减10。
返回是一个字符串,如果为空表示当次操作会使库存变为负数,应提示用户重新操作。
正常操作会返回库存操作新旧值,中间以逗号隔开,"125,105"
。