最近工作中要做一個秒殺系統,用戶的秒殺次數、分享數、優惠券的余額等都存放在了redis中,所以需要對多條redis的操作保證原子性。
當然可以在服務器端做鎖操作,不過更為方便的是在redis端操作。
於是想到了redis的lua腳本,lua腳本能夠保證redis執行的原子性(當然如果lua腳本報錯的話,無法回滾掉已執行的部分代碼的)
lua的基本語法:
變量定義:local 為標識符,代表局部變量。(在redis lua解釋器中禁用全局變量,所以變量都需要標識local)
字符串拼接:.. 如:'a'..'b'
類型轉換:tonumber(a)
判斷值為nil : not
邏輯判斷: and,or
lua學習:
redis中如果想要使用lua腳本,只需要調用eval命令即可。如果是在Java環境中,也有對應的eval(...)方法。
lua 中也分為局部變量和全局變量,不過redis為了防止數據污染,就限定了lua腳本中只允許使用局部變量
局部變量以local定義,比如:
local temp = keys[1]
eval 命令:
eval命令分為,腳本、key 數量,keys ,argv等,格式如下:
eval " local key = KEYS[1]
local c = redis.call('set',KEYS[2],ARGV[1])
if key == 'a' then
return c
else
return 1
end "
2 b a 3
"local key = KEYS[1] #定義局部變量,將外部設定的key賦值給key變量
local c = redis.call('set',KEYS[2],ARGV[1]) #將值賦值給key2 然后set到redis中,並給一個返回值
if key == 'a' then #判斷傳入的key
return c
else
return 1
end "
最終的返回值為1