Lua脚本语言学习

Lua 高效的轻量级脚本语言

Redis允许开发者使用Lua语言编写脚本传到Redis中执行。在lua脚本中可以调用大部分的redis命令。

优点:

  1. 较少网络开销:使用脚本功能完成同样的操作只需要发送给一个请求即可,减少网络往返时延。
  2. 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。无需事务,事务可以完成的功能都可以用脚本来实现。
  3. 复用:客户端发送的脚本会永久存储在redis中,这就意味着其他啊客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。

 

1. 数据类型:

Lua是一个动态类型语言,一个变量可以存储任何类型的值。

  1. 空(nil)
  2. 布尔(boolean)
  3. 数字(number)
  4. 字符串(string)
  5. 表(table)唯一的数据结构,即可以当数组又可以当字典,十分灵活
  6. 函数(function)函数在lua中是一等值(first-calss value),可以存储在变量中、作为函数的参数或返回结果

 

2. 变量:

Lua变量分为全局变量和局部变量。全局变量无需声明就可以直接使用,默认值为Nil.

在redis脚本中不能使用全局变量,只允许使用局部变量以防止脚本之间相互影响。声明局部变量的方法为local变量名。

3. 注释:

单行  -- 单行注释

多行

--[[

这是一个多行注释

]]

4. 赋值:

支持多重赋值

Local a,b = 1,2

Local c,d =1,2,3 (3被舍弃)

5. 操作符:

数学操作符:+、-、*、/、%、—(一元操作符,取负)、^(幂运算符号)

比较操作符:==、~=(与==结果取反)、<、>、<=、>=

逻辑运算符:not、and、or

not:根据操作数的真和假相应的返回false和true(只要操作数不是nil或false为真)

and:a and b a是真返回b,否则返回a

or : a or b a是假则返回a,否则返回b

连接操作符:..

Print(‘hello’..’ ’ ..’world!’)    -- ‘hello world!’

取长度操作符:#

Print(#’hello’)   -- 5

Lua脚本语言学习_第1张图片

6. If语句

If exp1 then

 Xxx

Elseif exp2 then

Xxx

Else

Xxx

End

;可省略,不强制要求缩进

7. 循环语句

Lua支持while、repeat和for循环语句

While exp1 do

Xxx

End

Repeat

Xxx

Until exp2

For 变量= 初值,终值,步长 do

    Xxx

End

 

8. 表类型

表是Lua中唯一的数据结构,可以理解为关联数组,任何类型的值都可以作为表的索引。

a = {}

a[‘field’] = ‘value’

print(a.field)

 

people={

name=’bob’

age=29}

 

a={}

a[1]=’bob’

a[2]=’jeff’

相当于

a = {‘bob’,’jeff’}

Lua约定数组的索引是从1开始的,而不是0;

迭代器:ipairs/pairs

前者只会从索引1开始递增遍历到最后一个值不为nil的证书索引。

后者会遍历所有值不为nil的索引。

9. 函数

Function(参数列表)

   函数体

   End

Local square = function(num)   -- 如果没有参数,()也不能省略

Return num*num

End

相当于

Local function square (num)

Return num*num

End

 

Lua标准库

Lua标准库中提供了很多实用的函数,redis支持大部分lua标准库。

Lua脚本语言学习_第2张图片

1. string库

string.len(string)             获取字符串长度

string.lower(string)           转换为小写

string.upper(string)           转换为大写

string.sub(string,start[,end])    获取子字符串

2. Table库

Table.concat(table[,sep[,i[,j]]])  将数组转换为字符串

Table.insert(table,[pos,] value)  向数组中插入元素

Table.remove(table[,pos])      从数组中弹出一个元素

3. Math库

Lua脚本语言学习_第3张图片

4. 其他库

Redis通过cjson库和cmsgpack库提供了对JSON和MessagePack的支持。Redis自动加载了这两个库,在脚本中可以分别通过cjson和cmsgpack两个全局变量来访问对应的库。

Redis与Lua

1. 在脚本中调用redis命令

reids.call(‘set’,’foo’,’bar’)

local value = redis.call(‘get’,’foo’)   -- value的值为bar

 

redis.pcall与redis.call功能相同,唯一的区别是当命令执行出错时redis.pcall会记录错误并继续执行,而redis.call会直接返回错误,不会继续执行。

2. 从脚本中返回值

使用return语句将值返回给客户端。

脚本相关命令

  1. EVAL命令:执行脚本
  2. EVALSHA命令:通过脚本内容的SHA1摘要执行脚本
  3. Script load :将脚本加入缓存
  4. SCRIPT EXISTS:判断脚本是否已经被缓存
  5. SCRIPT FLUSH:清空脚本缓存
  6. SCRIPT KILL:强制终止当前脚本的执行此

Redis> EVAL “return redis.call(‘set’,KEYS[1],ARGC[1])” 1 foo bar

Redis> get foo

“bar”

Redis的脚本执行此是原子的。所有命令必须等到脚本执行完成后才能执行,为了防止某个脚本执行时间过长导致redis无法提供服务,redis提供了Lua-time-limit参数限制脚本的最长运行时间,默认为5秒。

 

你可能感兴趣的:(Lua)