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

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

相关文章
相关标签/搜索