Lua 让Redis 更灵活

Redis的一些命令

  1. EVAL 执行Lua脚本
  2. EVALSHA 执行Lua脚本的sha1
  3. SCRIPT LOAD 加载Lua脚本到Redis Script
  4. SCRIPT FLUSH 清空Redis Script
  5. SCRIPT EXISTS 判断是否存在Rdis Script中
 
  

在 Lua 脚本中,可以使用两个不同函数来执行 Redis 命令,它们分别是:

  • redis.call()//报错时会 抛出错误,Lua脚本停止执行
  • redis.pcall()//不会抛出错误,Lua脚本继续执行 下面的语句

redis数据类型 lua数据类型
integer number
bulk string
multi bulk table
status 包含ok域的table
error 包含err域的table
nil bulk false
注意:

Redis不允许Lua创建全局变量(变量添加 local 前缀)

为了防止数据泄露进lua环境,redis脚本不循序创建全局变量.

访问一个全局变量(无论是否存在)都会引起脚本停止



1.Eval

EVAL script numkeys key [key ...] arg [arg ...]

   首先大家一定要知道eval的语法格式,其中:

   <1> script:     你的lua脚本

   <2> numkeys:  key的个数

   <3> key:         redis中各种数据结构的替代符号

   <4> arg:         你的自定义参数

Redis:

eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 arvg1 arvg2
 
  

2.Evalsha

Redis Evalsha 命令根据给定的 sha1 校验码,执行缓存在服务器中的脚本。

语法

redis Evalsha 命令基本语法如下:

 
  
  1. redis 127.0.0.1:6379> EVALSHA sha1 numkeys key [key ...] arg [arg ...]

参数说明:

  • script: 参数是一段 Lua 5.1 脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。
  • numkeys: 用于指定键名参数的个数。
  • key [key ...]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
  • arg [arg ...]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。

可用版本

>= 2.6.0

redis:

 
  
  1. redis 127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"
  2. "232fd51614574cf0867b83d384a5e898cfd24e5a"
  3.  
  4. redis 127.0.0.1:6379> EVALSHA "232fd51614574cf0867b83d384a5e898cfd24e5a" 0
  5. "hello moto"

3.Script Load 

Redis Script Load 命令用于将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

EVAL 命令也会将脚本添加到脚本缓存中,但是它会立即对输入的脚本进行求值。

如果给定的脚本已经在缓存里面了,那么不执行任何操作。

在脚本被加入到缓存之后,通过 EVALSHA 命令,可以使用脚本的 SHA1 校验和来调用这个脚本。

脚本可以在缓存中保留无限长的时间,直到执行 SCRIPT FLUSH 为止。

关于使用 Redis 对 Lua 脚本进行求值的更多信息,请参见 EVAL 命令。

实例

 
  
  1. redis 127.0.0.1:6379> SCRIPT LOAD "return 1"
  2. "e0e1f9fabfc9d4800c877a703b823ac0578ff8db"

4.Script Flush 

Redis Script Flush 命令用于清除所有 Lua 脚本缓存。

语法

redis Script Flush 命令基本语法如下:

 
  
  1. redis 127.0.0.1:6379> SCRIPT FLUSH

总是返回 OK

实例

 
  
  1. redis 127.0.0.1:6379> SCRIPT FLUSH
  2. OK


5.Script kill 

Redis Script kill 命令用于杀死当前正在运行的 Lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效。

这个命令主要用于终止运行时间过长的脚本,比如一个因为 BUG 而发生无限循环的脚本。

SCRIPT KILL 执行之后,当前正在运行的脚本会被杀死,执行这个脚本的客户端会从 EVAL 命令的阻塞当中退出,并收到一个错误作为返回值。

语法

redis Script kill 命令基本语法如下:

redis 127.0.0.1:6379> SCRIPT KILL

总是返回 OK

实例

redis 127.0.0.1:6379> SCRIPT KILL
OK



你可能感兴趣的:(Redis)