Redis入门(6) 您所在的位置:网站首页 Redis返回nil Redis入门(6)

Redis入门(6)

#Redis入门(6)| 来源: 网络整理| 查看: 265

Lua基本语法 表类型 函数 Redis执行脚本 KEYS与ARGV 沙盒与随机数 脚本相关命令 原子性和执行时间

Lua是一种高效的轻量级脚本语言,能够方便地嵌入到其他语言中使用。在Redis中,借助Lua脚本可以自定义扩展命令。

Lua基本语法 数据类型 空(nil),没有赋值的变量或表的字段值都是nil 布尔(boolean) 数字(number),整数或浮点数 字符串(string),字符串可以用单引号或双引号表示,可以包含转义字符如\n \r等 表(table),表类型是Lua语言中唯一的数据结构,既可以当数组又可以当字典,十分灵活 函数(function),函数在Lua中是一等值(first-class-value),可以存储在变量中、作为函数的参数或返回结果。 变量

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

a=1 -- 为全局变量a赋值 print(b) -- 无需声明即可使用,默认值是nil

局部变量:

local c -- 声明一个局部变量c,默认值是nil local d=1 -- 声明一个局部变量d并赋值为1 local e,f -- 可以同时声明多个局部变量

但在Redis中,为了防止脚本之间相互影响,只允许使用局部变量。

赋值

Lua支持多重赋值,如:

local a,b=1,2 --a的值是1,b的值是2 local c,d=1,2,3 --c的值是1,d的值是2,3被舍弃了 local e,f =1 --e的值是1,f的值是nil 操作符

数学操作符,包括常见的+ - * \ %(取模) -(一元操作符,取负)和幂运算符号^。

比较操作符,包括== ~=(不等于) > < >= SCRIPT LOAD "return redis.call('SET',KEYS[1],ARGV[1])" "cf63a54c34e159e75e5a3fe4794bb2ea636ee005" SCRIPT EXISTS

通过SHA1查询某个脚本是否被缓存,可以查询多个SHA1。参数必须是完整的SHA1,而不能像docker只输前几位。返回结果1表示存在。

SCRIPT FLUSH

Redis将脚本加入到缓存后会永久保留,如果要清空缓存可以使用SCRIPT FLUSH。

SCRIPT KILL

用于终止正在执行的脚本

原子性和执行时间

Redis的脚本执行是原子的,脚本执行期间其他命令不会被执行,必须等待上一个脚本执行完成。

但为了防止某个脚本执行时间过长导致Redis无法提供服务(比如陷入死循环),Redis提供了lua-time-limit参数限制脚本的最长运行时间,默认为5秒钟。当脚本运行时间超过这一限制后,Redis将开始接受其他命令,但为了确保脚本的原子性,新的脚本仍然不会执行,而是会返回“BUSY”错误。

可以打开两个redis-cli实例A和B来验证,首先在A执行一个死循环脚本:

EVAL "while true do end" 0

这时在实例B执行GET key1会返回: (error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.

如果按照错误提示,在B执行SCRIPT KILL,这时在实例A的脚本会被终止,并返回: (error) ERR Error running script (call to f_694a5fe1ddb97a4c6a1bf299d9537c7d3d0f84e7): @user_script:1: Script killed by user with SCRIPT KILL...

但如果A已经对Redis的数据做了修改,则SCRIPT KILL无法将其终止,A执行:

EVAL "redis.call('SET','foo','bar') while true do end" 0

如果在B尝试KILL脚本,会返回错误: (error) UNKILLABLE Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in a hard way using the SHUTDOWN NOSAVE command.

这时就只能通过SHUTDOWN NOSAVE命令强行终止Redis。SHUTDOWN NOSAVE与SHUTDOWN命令的区别在于,SHUTDOWN NOSAVE将不会进行持久化操作,所有发生在上一次快照后的数据库修改都会丢失!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有