Redis使用Lua脚本

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接收到之后还需要再转换为普通命令

  • 第二种方式:直接将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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

27、卷积 - 卷积特征的可视化和一个神奇的网站

既然上一节说了卷积的本质是一个特征提取器,那么既然卷积神经网络在图像分类、图像检测、图像分割以及其他领域有这么好的表现,卷积算法到底提取了什么特征呢? 虽然有时候我们说神经网络是个黑盒,但是研究人员也一直在探索,如何将卷积学习到的特征给分析出来。 就是想要…

我们是如何让微服务在实践中“活色生香”的?

文章目录 🔊博主介绍🥤本文内容1. 前言2. 请求的路径分析3. 服务周期分析4. 请求格式转换5. 服务层设计6. 业务服务层设计7. 安全防护及策略8. 结论 📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟&#xf…

带你学C语言:带你学函数

目录 🌍函数的概念 ★★☆☆☆库函数 ★★★★☆自定义函数 ★★★☆☆形参与实参 ★★★☆☆return语句 ★★★☆☆数组做函数参数 ★★★☆☆嵌套调用和链式访问 ★★★☆☆函数的声明和定义 ✍结束语 🌍函数的概念 数学中我们其实就见过函数…

系统运维安全之病毒自检及防护

一、前言 Linux勒索病毒(Linux ransomware)是一种最令人恶心的计算机恶意病毒,它以侵入Linux系统,捆绑文件并要求支付赎金才能释放文件为主要目的,破坏用户的数据,造成数据讹诈。Linux勒索病毒它们的存在已…

【华为OD题库-072】相对开音节-java

题目 题目描述: 相对开音节构成的结构为辅音元音(aeiou)辅音(r除外)e 常见的单词有bike cake 给定一个字符串,以空格为分隔符反转每个单词的字母 若单词中包含如数字等其他非字母时不进行反转 反转后计算其中含有相对开音节结构的子串个数(连续子串中部分字符可以重…

算法通关村第十七关-青铜挑战贪心算法思想

大家好我是苏麟 , 今天说说贪心算法 . 贪心思想很难用理论解释,本文我们先通过案例来感受一下贪心是如何解决问题的 大纲 难以理解的贪心算法贪心问题举例分发饼干柠檬水找零分发糖果 难以理解的贪心算法 贪心的思想非常不好解释,而且越使用权威的语言解…

如何解读手机APP入侵与逆向破解

如果您有耐心看完这篇文章,您将懂得如何着手进行app的分析、追踪、注入等实用的破解技术,另外,通过“入侵”,将帮助您理解如何规避常见的安全漏洞,文章大纲: 简单介绍ios二进制文件结构与入侵的原理介绍入…

报错:Parsed mapper file: ‘file mapper.xml

报错 : Logging initialized using class org.apache.ibatis.logging.stdout.StdOutImpl adapter. Registered plugin: com.github.yulichang.interceptor.MPJInterceptor3b2c8bda Parsed mapper file: file [/Mapper.xml] application无法启动 我这边产生原因是项…

P1004 [NOIP2000 提高组] 方格取数

洛谷的题 网址:P1004 [NOIP2000 提高组] 方格取数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 动态规划,太tm爽了 一般来说是走一次的,这个是走两次,就变难了 怎么办呢? 一个方法是:同时开始走 先…

自定义TypeHandler 将mysql返回的逗号分隔的String转换到List

sql执行如下&#xff1a; 这里我定义的接受类&#xff1a; 但是这里报了错JSON parse error: Cannot deserialize value of type java.util.ArrayList<java.lang.String>from Object value (token JsonToken.START_OBJECT); nested exception is com.fasterxml.jackson…

C读取CSV文件,通过某种条件,按照特定行和同一列进行读取

读取CSV文件&#xff0c;按照特定行和列进行读取 1、source #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <wchar.h> #include <locale.h>#define MAX_LINE_LENGTH 1000 #define MAX_COLUMNS 50// 函数声明 int findTargetColumn(wchar_t*…

Java抽象类(abstract class)和接口(interface)的区别——面试

1.抽象类&#xff08;abstract class&#xff09;和接口&#xff08;interface&#xff09;的区别&#xff1a; 抽象类可以有构造方法&#xff0c;接口中不能有构造方法。 抽象类中可以有普通成员变量&#xff0c;接口中没有普通成员变量。抽象类中可以包含非抽象的普通方法&am…

ultralytics yolo图像分类训练案例;pytorch自有数据集图像分类案例

1、ultralytics yolo图像分类训练案例 优点:使用方便,训练过程评估指标可以方便查看 缺点:自带模型少,可选择自定义小 参考:https://docs.ultralytics.com/tasks/classify/#val https://blog.csdn.net/weixin_42357472/article/details/131412851 1)数据集格式 https://…

dockerdesktop 制作asp.net core webapi镜像-连接sqlserver数据库容器

1.使用visual studio 创建 asp.net core webapi项目 选择启用docker 会生成Dockerfile文件 2.使用efcore连接数据库&#xff0c;安装efcore的包 <ItemGroup><PackageReference Include"Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version&qu…

Linux系统调试课:PCIe调试手段

文章目录 一、lspci 命令二、pciutils 工具沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文我们要介绍pcie调试手段。 一、lspci 命令 通过lspci可以查看当前系统挂载了哪些pci设备。 lspci - 列出 PCI 设备 lspci 命令可以列出计算机中所有 PCI 设备的详细信息,…

[传智杯 #3 决赛] 子串

题目背景 disangan233 喜欢字符串&#xff0c;于是 disangan333 想让你找一些 disangan233 喜欢的串。 题目描述 在传智的开发课堂上&#xff0c;希望您开发一款文档处理软件。 给定 T 组询问&#xff0c;每次给定 22 个长度为 n,m 的只含英文字母的字符串 a,b&#xff0c;…

Hadoop学习笔记(HDP)-Part.03 资源规划

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

【Transformer论文精读系列】(一)如何理解Transformer里的注意力机制?

论文&#xff1a;Attention Is All You Need 参考李沐老师的讲解视频&#xff1a; Transformer论文逐段精读【论文精读】_哔哩哔哩_bilibili 其他参考&#xff1a; 超强动画&#xff0c;一步一步深入浅出解释Transformer原理&#xff01;_哔哩哔哩_bilibili Transformer论文逐段…

JVM虚拟机:JVM参数之X参数

本文重点 本文将学习x参数 x参数 -Xint:解释执行 -Xcomp&#xff1a;第一次使用就编译成本地代码 -Xmixed&#xff1a;混合模式&#xff08;Javac、java&#xff0c;先编译后执行&#xff09;

17、迭代器模式(Iterator Pattern)

迭代器模式提供了顺序访问集合对象中的各种元素&#xff0c;而不暴露该对象内部结构的方法。如Java中遍历HashMap。 迭代器模式将遍历集合中所有元素的操作封装成迭代器类&#xff0c;其目的是在不暴露集合对象内部结构的情况下&#xff0c;对外提供统一访问集合的内部数据的方…