当前位置: 首页 > 后端技术 > Java

Redis使用lua

时间:2023-04-01 18:51:29 Java

基本操作在redis中执行lua有两种方式:evalevalsha第一种是直接使用redis执行lua脚本或命令,第二种相当于将脚本或命令保存在redis中,然后使用一个Stringsha代码调用(可以理解为调用函数)eval命令行执行eval脚本内容keynumberkeylistparameterlistscriptcontent为要执行的lua脚本内容key个数表示参数中有多个key,而redis中的key是从1开始的,如果没有key参数,就写0key列表,作为参数传递给lua语言。在lua中,KEYS[n]用于获取对应的参数。参数列表传递给Lua语言,可以填也可以不填。在lua中使用ARGV[n]获取对应的参数示例(在redis中执行):eval'return"hello"..KEYS[1]..ARGV[1]'1redisworldoutput:"helloredisworld"passedhere输入的key个数为1,所以redis为key,world为参数执行lua脚本文件redis-cli--eval脚本文件key列表,参数列表evalsha这个操作相当于把脚本加载到redis中得到一个SHA1校验And,然后用这个SHA1码去调用对应的Lua脚本,避免每次都发送Lua脚本。Loadscript脚本加载示例:redis-cliscriptload"$(catdel-batch.lua)""e812abcb57c0360287ff97f74e444c04144382c9"使用执行evalshaevalsha脚本shavaluekeynumberkeylist参数列表如:127.0.0.1:6379>evalshae812abcb57c0360287ff97f74e444c04144382c91A*"delpatternis:A*,countis:0"Redis管理脚本redis提供了几个管理脚本的命令scriptloadscriptexistsscriptflushscriptkillscriptload用于加载Lua脚本到redis内存中用于判断sha1值是否已经加载到redis内存中scriptexistssha1...returnsthenumberscriptflush用于清除所有加载到redis内存中的脚本flushscriptkill用于杀死正在执行的Lua脚本scriptkill如果lua脚本比较耗时,甚至lua脚本有问题,那么lua脚本的执行就会阻塞redis,直到脚本执行完或者外部干预结束。需要注意的一点是,如果Lua脚本正在执行写操作,scriptkill命令是不会生效的。这时候只能等待脚本执行结束,或者使用shutdownsave停止redis服务。使用Lua的优点Lua脚本在Redis中是原子执行的,执行过程中不会插入其他命令。Lua脚本可以帮助开发和运维人员创建自己定制化的命令,并将这些命令存放在内存中,达到多路复用的效果。Lua脚本可以一次打包多个命令,有效降低网络开销。在lua脚本中调用redis方法可以参考redis官方文档有两种方法调用redis.call()redis.pcall()。两种方法都可以调用。不同的是call()方法遇到下面的内容就停止执行,直接返回错误,而pcall遇到异常会被忽略,继续执行eval"returnredis.call('set','foo','bar')"0OK其他命令见文档批量删除示例,文件名为del-batch.lua--定义游标cur的初始值为0localcur=0--定义初始删除次数的值localcount=0--循环调用repeat--调用游标localresult=redis.call("scan",cur,"match",KEYS[1])--将下一个游标点转换为数字cur=tonumber(result[1])localarr=result[2]--循环当前游标获得的值并删除if(arr~=niland#arr>0)thenfori,kinpairs(arr)dolocalkey=tostring(k)--或者使用redis.call("unlink",key)redis.call("del",key)count=count+1endend--当光标点为0时,退出循环until(cur<=0)--返回执行结果return"delpatternis:"..KEYS[1]..",countis:"..countcallredis-cli--evaldel-batch.lua"TEST_KEY*"会在执行"delpatternis:TEST_KEY*,countis:300"