Redisシリーズ|阿里雲Redis版データベースLuaスクリプトサポートと制限
1591 ワード
Lua使用制限
スクリプト内のすべての操作が同じslotで行われることを保証するために、クラウドデータベースRedisクラスタバージョンではLuaスクリプトに次の制限があります.
すべてのキーはKEYS配列によって伝達されるべきだcall/pcallで呼び出されたredisコマンド.キーの位置はKEYS arrayでなければなりません(Lua変数でKEYSを置き換えることはできません).そうしないと、エラーメッセージが直接返されます.
オリジナルのLuaスクリプト作成
以上のスクリプトは、オリジナルのRedisでは実行できますが、アリクラウドRedisでは実行できません.falseに直接戻ります.
公式の制限を説明します.
keyの位置はKEYS array(Lua変数でKEYSを置き換えることはできません)でなければなりませんが、上のスクリプトはKEYS[1]をLua変数rate_に割り当てています.key、使用できない
最終的な互換バージョンの変更
スクリプト内のすべての操作が同じslotで行われることを保証するために、クラウドデータベースRedisクラスタバージョンではLuaスクリプトに次の制限があります.
すべてのキーはKEYS配列によって伝達されるべきだcall/pcallで呼び出されたredisコマンド.キーの位置はKEYS arrayでなければなりません(Lua変数でKEYSを置き換えることはできません).そうしないと、エラーメッセージが直接返されます.
オリジナルのLuaスクリプト作成
$script = <<= limit then
return 0
else
redis.call("INCR", rate_key)
return 1
end
end
luascript;
$scriptSha = $redis->script('load', $script);
以上のスクリプトは、オリジナルのRedisでは実行できますが、アリクラウドRedisでは実行できません.falseに直接戻ります.
公式の制限を説明します.
keyの位置はKEYS array(Lua変数でKEYSを置き換えることはできません)でなければなりませんが、上のスクリプトはKEYS[1]をLua変数rate_に割り当てています.key、使用できない
最終的な互換バージョンの変更
local limit = tonumber(ARGV[1]) --
local expire_time = ARGV[2] --
local result = redis.call('SETNX',KEYS[1],1); -- SETNX , 1。 0
if result == 1 then
redis.call('expire',KEYS[1],expire_time)
return 1
else
if tonumber(redis.call("GET", KEYS[1])) >= limit then
return 0
else
redis.call("INCR", KEYS[1])
return 1
end
end
luascript;
$scriptSha = $redis->script('load', $script);