Redisシリーズ|阿里雲Redis版データベースLuaスクリプトサポートと制限

1591 ワード

Lua使用制限
スクリプト内のすべての操作が同じ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);