使用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

相關文章
相關標籤/搜索