在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