Aerospike实战之UDF(用户自定义函数)

2022-06-21 00:00:00 函数 参数 自定义 属性 是否存在

Aerospike可以用lua在服务端创建自定义函数,可以提高服务端的操作效率,使用自定义函数的前提上对lua语法有个基本的了解。

如下是创建的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
<ns>命名空间
<set>setname
<key> key
<module>lua脚本文件名,不带后缀
<function>函数名
ARGS 参数列表

ascli -h 192.168.0.15 -p 3000 udf-record-apply upf testuser ${var1} updateIntt updateIntt "{\"appendIntt\": \"${var2}\"}" "{\"sqid\": \"${var1}\
其中${var1}为key的位置,appendIntt和sqid为我定义函数时需要传的参数;

需要注意以下几点:

1,ARGS 参数传递的时候一定要按照定义函数时的顺序,要不有些参数会取不到;

2,ARGS 每个参数都是一个单独的json格式,比如'{"a":"b"}',不能把多个参数写到同一个json里面进行传递。
————————————————
版权声明:本文为CSDN博主「星月菩提」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/songhuiqiao/article/details/50433515

相关文章