看这个文章之前请确认自己已经掌握了lua 的基本语法 , 如果不会先去看看lua的教程, 很简单, 在基本的操作redis中, 看一下的目录就知道了, 看完前面的部分就暂时够用了:
菜鸟教程 https://www.runoob.com/lua/lua-tables.html
先说下使用Lua脚本的好处:
调用的通用形式如下:
EVAL script numkeys key [key ...] arg [arg ...]
eval的语法格式,其中:
<1> script: 你的lua脚本
<2> numkeys: key的个数
<3> key: redis中各种数据结构的替代符号
<4> arg: 你的自定义参数
注意:必须是 KEYS[1] 大小写敏感, KEYS是键 , ARGV 是值
示例:
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 zk zk2 1 50
当然了还可以这么用, 这是不规范的用法,只是说说, 尽量写成键值对的形式
在Lua脚本中使用两个不同的Lua函数来调用Redis的命令的例子:
redis.call()
redis.pcall()
redis.call() 与 redis.pcall()很类似, 他们唯一的区别是当redis命令执行结果返回错误时, redis.call()将返回给调用者一个错误,而redis.pcall()会将捕获的错误以Lua表的形式返回
redis.call() 和 redis.pcall() 两个函数的参数可以是任意的 Redis 命令
eval "return redis.call('set','foo','bar')" 0
不过一般不这么写, 不把参数写在里面, 把参数放在外面. 这样写
eval "return redis.call('set',KEYS[1],'bar')" 1 foo
redis是使用C语言实现的, 而lua的数据类型和C有一些区别,这就涉及到两者之间的类型转换:
浮点数和nil将怎么样处理:
> eval "return {1,2,3.3333,'foo',nil,'bar'}" 0
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) "foo"
正如你看到的 3.333 被转换成了3,并且 nil后面的字符串bar没有被返回回来。
示例:
for i=1,10000 do
redis.call("set","key"..i,"value"..i)
end
写一个a.lua的脚本,插入1W条数据到redis中,只需要使用lua执行此脚本就行了.
redis-cli --eval a.lua (linux)
redis-cli.exe --eval a.lua (window) 假设你都已经配置到了环境变量
一个很简单的程序, 输入key 获取value
local key=KEYS[1]
local value = redis.call("get",key)
return value
执行脚本, 就能够获取到get 的值了
redis-cli.exe --eval 2.lua name2
注意了,这里直接执行lua脚本的时候,如果里面有参数,就不需要写参数的数量了,直接写参数
获取list 的值
local key=KEYS[1]
local startNum=KEYS[2]
local endNum=KEYS[3]
local list=redis.call("lrange",key,startNum,endNum)
return list
redis-cli.exe --eval 3.lua mylist 0 -1
好了, 就写这么多了, 自己多实践.
Java Framework,欢迎各位前来交流java相关
QQ群:965125360