免费logo网站,网页制作网站图片,免费网站应用软件,网站设计欣赏Lua脚本 redis可以支持lua脚本#xff0c;可以使用lua脚本来将几个命令整合为一个整体来执行#xff0c;这样可以使得多个命令原子操作#xff0c;且可以减少网络开销 Lua的数据类型 Lua是一个动态类型的语言#xff0c;一个变量可以存储任何类型的值#xff0c;类型有可以使用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接收到之后还需要再转换为普通命令 第二种方式直接将lua脚本记录/发送 如果直接发送lua脚本有些命令可能会导致每个机器执行的结果不同如取随机数等 这个redis会决定采取哪种方式来执行在执行前会进行检测写操作是否执行了RANDOMKEY命令来决定使用哪种方式 evalsha命令 考虑到脚本比较长的情况如果每次调用脚本都需要将整个脚本传给redis会占用较多的带宽。为了解决该问题redis提供了evalsha命令允许开发者通过脚本内容的SHA1摘要来执行脚本该命令的用法的eval一样不过是将脚本内容替换为脚本内容的SHA1摘要。 redis在执行eval命令时会计算脚本的SHA1摘要并记录在脚本缓存中执行evalsha命令时redis会根据提供的摘要从脚本缓存中查找对应的脚本内容如果找到了则执行脚本否则返回错误 使用流程 先计算脚本的SHA1摘要并使用evalsha命令执行脚本 获的返回值如果返回NoScript错误则使用eval命令重新执行脚本 其他不常用的命令 这些命令不是不常用而是经常被工具类封装起来开发者如果不深入源码查看很少会用到 将脚本加入缓存 SCRIPT LOAD命令作用是每次执行eval命令时redis都会将脚本的SHA1摘要加入到脚本缓存中以便下次客户端可以使用evalsha命令调用该脚本。如果只是希望将脚本加入缓存而不执行则使用SCRIPT LOAD命令返回值是脚本的SHA1摘要 判断脚本是否被缓存 SCRIPT EXISTS命令可以同时查找多个脚本的SHA1摘要是否被缓存 清空脚本缓存 SCRIPT FLUSH命令redis将脚本的SHA1摘要加入到脚本缓存后会永久保留不会删除可以使用该命令清空脚本缓存 强制终止当前脚本的执行 SCRIPT KILL命令如果想终止当前正在执行的脚本可以使用该命令 https://zhhll.icu/2021/数据库/非关系型数据库/redis/基础/14.lua脚本/ 本文由 mdnice 多平台发布