Aerospike実戦のUDF(ユーザカスタム関数)
Aerospikeはluaでサービス側にカスタム関数を作成することができ、サービス側の操作効率を高めることができ、カスタム関数を使用する前提でlua文法について基本的な理解がある.
以下にUDFを作成し、主な役割はユーザーのkeyが存在するかどうかを判断し、存在しない場合は新しいkeyと新しい属性を作成することである.
keyが存在する場合はintt属性が存在するか否かを判断し,intt属性のvalueが具体的な業務存在を行うと判断する.
関数の定義は次のとおりです.
上のコードをupdateInttに保存します.luaファイルで、ascli udf-putコマンドでこのカスタムファイルをAerospikeサービスにアップロードします.
ascli udf-put updateIntt.luaはasが配備したクラスタ上で実行でき、リモートアップロードであれば以下のコマンドを使用できます.
ascli -h ip -p port udf-put updateIntt.luaアップロード後、ascli udf-listでupdateInttが存在するかどうかを確認できます.lua、現れたらアップロードに成功したことを示します.
次に、カスタム関数を呼び出します.呼び出し方法は次のとおりです.
ネーミングスペース
setname
key
luaスクリプトファイル名、接尾辞なし
関数名
ARGSパラメータリスト
ascli -h 192.168.0.15 -p 3000 udf-record-apply upf testuser ${var1} updateIntt updateIntt "{\"appendIntt\":\"${var2}\"}""{\"sqid\":\"${var1}\
ここで、${var 1}はkeyの位置であり、appendInttとsqidは私が関数を定義する際に伝達する必要があるパラメータである.
以下の点に注意してください.
1,ARGSパラメータを渡すときは必ず関数を定義する順序に従って、パラメータが取れない場合があります.
2,ARGSは各パラメータが単独のjson形式であり,{「a」:「b」}」のように,複数のパラメータを同じjsonに書き込んで伝達することはできない.
Aerospike交流QQ群:419183757
以下にUDFを作成し、主な役割はユーザーのkeyが存在するかどうかを判断し、存在しない場合は新しいkeyと新しい属性を作成することである.
keyが存在する場合はintt属性が存在するか否かを判断し,intt属性のvalueが具体的な業務存在を行うと判断する.
関数の定義は次のとおりです.
local function Split(szFullString, szSeparator) -- Split
local nFindStartIndex = 1
local nSplitIndex = 1
local nSplitArray = {}
while true do
local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
if not nFindLastIndex then
nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
break
end
nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
nFindStartIndex = nFindLastIndex + string.len(szSeparator)
nSplitIndex = nSplitIndex + 1
end
return nSplitArray
end
function updateIntt(rec,appendIntt,sqid)--rec Aerospike , ,
local ret = map()
if not aerospike:exists(rec) then-- rec
ret['status'] = 'DOES NOT EXIST'
rec['sqid'] = sqid['sqid']
rec['intt'] = appendIntt['appendIntt']
aerospike:create(rec)-- key, sqid intt
else--key intt
--ret['status'] = 'DOES EXIST'
local intt = rec['intt']
if intt == nil then
--rec['sqid'] = userid['userid']
rec['intt'] = appendIntt['appendIntt']
ret['status'] = 'INTT DOES NOT EXIST'
ret['intt'] = appendIntt['appendIntt']
else
ret['status'] = 'INTT DOES EXIST'
local intt = rec['intt']
local appendIntt = appendIntt['appendIntt']
local list = Split(appendIntt, ':')
local l1 = list[1] .. ':'
if string.find(intt, l1) ~= nil then
ret['status'] = 'appendIntt is old'
local l2 = list[2]
--local list2 = Split(intt, ':')
ret['l2'] = l2
else
ret['status'] = 'appendIntt is new'
rec['intt'] = intt .. ',' .. appendIntt
ret['intt'] = intt .. ',' .. appendIntt
end
end
aerospike:update(rec)--
end
--aerospike:update(rec)
return ret
end
上のコードをupdateInttに保存します.luaファイルで、ascli udf-putコマンドでこのカスタムファイルをAerospikeサービスにアップロードします.
ascli udf-put updateIntt.luaはasが配備したクラスタ上で実行でき、リモートアップロードであれば以下のコマンドを使用できます.
ascli -h ip -p port udf-put updateIntt.luaアップロード後、ascli udf-listでupdateInttが存在するかどうかを確認できます.lua、現れたらアップロードに成功したことを示します.
次に、カスタム関数を呼び出します.呼び出し方法は次のとおりです.
ascli udf-record-apply <ns> <set> <key> <module> <function> ARGS
ARGSパラメータリスト
ascli -h 192.168.0.15 -p 3000 udf-record-apply upf testuser ${var1} updateIntt updateIntt "{\"appendIntt\":\"${var2}\"}""{\"sqid\":\"${var1}\
ここで、${var 1}はkeyの位置であり、appendInttとsqidは私が関数を定義する際に伝達する必要があるパラメータである.
以下の点に注意してください.
1,ARGSパラメータを渡すときは必ず関数を定義する順序に従って、パラメータが取れない場合があります.
2,ARGSは各パラメータが単独のjson形式であり,{「a」:「b」}」のように,複数のパラメータを同じjsonに書き込んで伝達することはできない.
Aerospike交流QQ群:419183757