Lua脚本
redis可以支持lua脚本,可以使用lua脚本来将几个命令整合为一个整体来执行,这样可以使得多个命令原子操作,且可以减少网络开销
Lua的数据类型
Lua是一个动态类型的语言,一个变量可以存储任何类型的值,类型有:
-
空:nil,也就是还没有赋值
-
字符串:用单引号 或者 双引号
-
数字:包含整数和浮点型
-
布尔:boolean
-
表:表是Lua唯一的数据结构,既可以当数组,也可以做Map,或被视为对象
-
函数:封装某个或某些功能
-
userData:用来将任意 C 数据保存在 Lua 变量中,这样的操作只能通过 C API
-
Thread:用来区别独立的执行线程,它被用来实现 coroutine (协同例程)
eval命令
redis内有内置的lua解释器,可以使用eval命令对lua脚本进行求值
# script是lua脚本
# numkeys指定键名参数的个数
# key [key ...] 在脚本中使用的redis键,个数为numkeys指定的个数,可以在lua中通过全局变量KEYS数组,从1开始,KEYS[1],KEYS[2]等
# arg [arg ...] 参数,可以在lua中通过全局变量ARGV数组访问,ARGV[1],ARGV[2]等
eval script numkeys key [key ...] arg [arg ...]
#示例:
eval "return {KEYS[1],KEYS[2],ARGV[1]}" 2 key1 key2 first
还可以在lua脚本中调用redis命令,使用redis.call
eval "return redis.call('set',KEYS[1],'bar')" 1 foo
需要注意的是,redis执行lua脚本和普通命令一样,都是会写入AOF文件和发布至主从复制连接上的,有两种方式
-
普通命令会转化为redis通信协议的格式,比起lua脚本来说,浪费了更多的带宽,而且slave接收到之后还需要再转换为普通命令
-
evalsha命令
考虑到脚本比较长的情况,如果每次调用脚本都需要将整个脚本传给redis会占用较多的带宽。为了解决该问题,redis提供了evalsha命令允许开发者通过脚本内容的SHA1摘要来执行脚本,该命令的用法的eval一样,不过是将脚本内容替换为脚本内容的SHA1摘要。
redis在执行eval命令时会计算脚本的SHA1摘要并记录在脚本缓存中,执行evalsha命令时redis会根据提供的摘要从脚本缓存中查找对应的脚本内容,如果找到了则执行脚本,否则返回错误
使用流程
其他不常用的命令
这些命令不是不常用,而是经常被工具类封装起来,开发者如果不深入源码查看,很少会用到
将脚本加入缓存
SCRIPT LOAD命令,作用是每次执行eval命令时redis都会将脚本的SHA1摘要加入到脚本缓存中,以便下次客户端可以使用evalsha命令调用该脚本。如果只是希望将脚本加入缓存而不执行,则使用SCRIPT LOAD命令,返回值是脚本的SHA1摘要
判断脚本是否被缓存
SCRIPT EXISTS命令,可以同时查找多个脚本的SHA1摘要是否被缓存
清空脚本缓存
SCRIPT FLUSH命令,redis将脚本的SHA1摘要加入到脚本缓存后会永久保留,不会删除,可以使用该命令清空脚本缓存
强制终止当前脚本的执行
SCRIPT KILL命令,如果想终止当前正在执行的脚本可以使用该命令
原文地址:https://blog.csdn.net/Lxn2zh/article/details/134801520
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_47468.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!