Redis lua教程

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

                                                            Redis lua教程_第1张图片

菜鸟教程 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

好了, 就写这么多了, 自己多实践.

 

Java Framework,欢迎各位前来交流java相关
QQ群:965125360

 

你可能感兴趣的:(Redis)