看这个文章之前请确认自己已经掌握了lua 的基本语法 , 如果不会先去看看lua的教程, 很简单, 在基本的操作redis中, 看一下的目录就知道了, 看完前面的部分就暂时够用了:

菜鸟教程 https://www.runoob.com/lua/lua-tables.html
如果你觉得学lua太难了, 可能这个文章不适合您. 请出门左转去看敖厂长屠龙.
先说下使用Lua脚本的好处:
- 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。
- 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。
- 复用。客户端发送的脚本会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。
调用的通用形式如下:
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

好了, 就写这么多了, 自己多实践.
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179318.html原文链接:https://javaforall.net
