使用Redis操作库存,安全,高效,可靠

1,869 阅读1分钟

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"