文章目录

  • 前言
  • 一、Lua脚本的使用
    • 1.EVAL命令
    • 2.Evalsha命令
    • 3.SCRIPT命令
  • 二、Lua脚本的返回值
  • 注意

前言

Lua 由标准 C 编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。

Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本。

Redis实例支持Lua相关命令,通过Lua脚本可高效地处理CAS(check-and-set)命令,进一步提升Redis的性能,同时可以轻松实现以前较难实现或者不能高效实现的模式。Lua语言编写脚本传到Redis中执行,在Lua脚本中也可以调用大部分的Redis命令。使用脚本有以下三个好处:

  • 减少网络开销:有些时候需要多次请求Redis获取处理数据,而使用脚本功能就可以只使用一次请求完成相同操作,减少了网络往返时延。
  • 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。也就是说在编写脚本的过程中无须担心会出现竞态条件,也就是无须使用事务。事务可以完成的所有功能,都可以用脚本来完成。
  • 复用:客户端发送的脚本会永久存储在Redis中,这就意味着其他客户端(可以是其他语言开发的项目)可以复用这一脚本而不需要使用代码完成同样的逻辑。

一、Lua脚本的使用

Redis调用Lua的方式主要又如下几种

1.EVAL命令

EVAL的命令格式如下:

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

字段说明:

  • script:脚本内容。
  • numkeys:key参数的数量。
  • key和arg:这两个参数向脚本传递数据,它们的值可以在脚本中分别使用KEYS[index]和ARGV[index]两个表类型的全局变量访问,numkeys为key的数量和其索引的最大值,argv的索引为key和argv数量总和减去numkeys,它们的索引都是从1开始,超出则返回nil。
PS C:\Users\Happy\devTools\Redis-x64-3.2.100> redis-cli
127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"

2.Evalsha命令

EVAL的命令格式如下:

EVALSHA sha1 numkeys key [key ...] arg [arg ...]

字段说明:

  • sha1 : 通过 SCRIPT LOAD 生成的 sha1 校验码。
  • numkeys: 用于指定键名参数的个数。
  • key [key …]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
  • arg [arg …]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。
127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"
"232fd51614574cf0867b83d384a5e898cfd24e5a"
127.0.0.1:6379> EVALSHA "232fd51614574cf0867b83d384a5e898cfd24e5a" 0
"hello moto"

3.SCRIPT命令

  • SCRIPT LOAD script:将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。
  • SCRIPT EXISTS script [script …]:查看指定的脚本是否已经被保存在缓存当中。
  • SCRIPT FLUSH:从脚本缓存中移除所有脚本。
  • SCRIPT KILL:杀死当前正在运行的 Lua 脚本。如果当前执行的脚本对Redis的数据进行了修改,则SCRIPT KILL不会终止脚本的运行,因为这样违背了原子性。
  • SHUTDOWN NOSAVE:强制终止Redis将原先脚本的修改操作返回,不进行持久化操作,这意味着所有发送在上一次的快照后的数据库修改都会丢失。

二、Lua脚本的返回值

很多情况下,都需要脚本通过return返回值,如果没有执行return则默认返回nil。因为我们可以像调用其他Redis内置命令一样调用我们自己写的脚本,所以同样Redis会自动将脚本返回值的Lua数据类型转化成Redis的返回值类型。具体的转换规则如下:

1、Lua的数字类型,Redis为整数类型。

127.0.0.1:6379> eval 'return 1.1' 0
(integer) 1

2、Lua的字符串类型,Redis也是字符串类型

3、 Lua的表类型(数组形式),Redis会返回多行字符串

127.0.0.1:6379> eval 'return {0,1}' 0
1) (integer) 0
2) (integer) 1

4、 Lua表类型(只有一个ok字段存储状态信息),Redis为成功状态回复

127.0.0.1:6379> eval 'return {ok="this is ok"}' 0
this is ok

5、Lua表类型(只有一个err字段存储状态信息),Redis为错误状态回复

127.0.0.1:6379> eval 'return {err="so bad"}' 0
(error) so bad

6、Lua的bool类型中true为Redis的1,false为nil

127.0.0.1:6379> eval 'return true' 0
(integer) 1
127.0.0.1:6379> eval 'return false' 0
(nil)

注意

Redis脚本禁止使用Lua标准库中与文件或系统调用相关的函数,在脚本中只允许对Redis的数据进行处理。并且Redis还通过禁用脚本的全局变量的方式保证每个脚本都是相对隔离的,不会互相干扰。

【愚公系列】2022年11月 Redis数据库-Lua脚本的使用相关推荐

  1. 2022年12月 Redis数据库-Lua脚本的使用

    文章目录 前言 一.Lua脚本的使用 1.EVAL命令 2.Evalsha命令 3.SCRIPT命令 二.Lua脚本的返回值 注意 前言 Lua 由标准 C 编写而成,代码简洁优美,几乎在所有操作系统 ...

  2. 2022年11月国产数据库大事记-墨天轮

    本文为墨天轮社区整理的2022年11月国产数据库大事件和重要产品发布消息. 文章目录 11月国产数据库大事记(时间线) 产品/版本发布 兼容认证 排行榜新增数据库 11月国产数据库大事记(时间线) 1 ...

  3. 【愚公系列】2022年01月 华为鸿蒙OS-03-四种模式开发实操

    文章目录 前言 一.使用JS语言开发(传统代码方式) 1.index页面源码 2.details页面源码 二.使用JS语言开发(低代码方式) 1.新建工程:注意选择 2.选择低代码新建页面 3.页面分 ...

  4. 2022年11月多家权威机构____编程语言排行榜__薪酬状况

    2022年11月多家权威机构____编程语言排行榜__薪酬状况 目 录: 一.TIOBE统计数据(2022年11月) (1)2022年11月的编程语言流行度指数排行 (2)编程语言多年流行回顾 (3) ...

  5. sql 返回日期的年月部分_公示|2020年11月部分志愿活动名单公示

    2020年11月 部分志愿活动名单公示 2020年11月18日 人文与法学学院院楼协助分发教职工运动会服装志愿活动 2020年11月19日 人文与法学学院院楼"收彩旗"志愿活动 2 ...

  6. 2022年11月骨传导耳机排名,骨传导蓝牙耳机品牌怎么选?

    近些年市面上供消费者选择的骨传导蓝牙耳机品牌众多,有突出防水功能的骨传导耳机,也有突出音质的骨传导耳机,2022年11月市面上又出现了许多新款骨传导蓝牙耳机,这些各式各样的骨传导耳机排名情况如何?骨传 ...

  7. 【数据分享】2022年11月西南地区POI数据分享(重庆、四川、贵州、云南、西藏)

    一.数据概况 今天分享一份西南地区的POI数据,包含重庆市.四川省.贵州省.云南省.西藏自治区5个省级行政区. 数据时间为2022年11月,坐标系是GCJ-02. 较2022年3月的POI数据,5个区 ...

  8. 第14届蓝桥杯STEMA测评真题剖析-2022年11月27日Scratch编程初中级组

    [导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第117讲. 蓝桥杯选拔赛现已更名为STEMA,即ST ...

  9. 2022年11月PMP考试时间出炉!考生须知

    中国大陆地区2022年第二期PMP认考试将在满足疫情防控和考试组织条件的基础上,暂定于11月27日上午举办,此次考试将采取分地区.分批次的报名方式. 一.报名网站 本网站是中国国际人才交流基金会新版项 ...

最新文章

  1. (转载)spring jar包详细介绍
  2. 3D目标检测2021
  3. 阿里云的服务器内网互通的前提条件
  4. 提高代码的运行效率(1)
  5. Windows Server 2016-Hyper-V HNV 新增功能
  6. hadoop yarn 获取日志_Hadoop YARN日志查看方式
  7. 39. 后台模块开发(4)
  8. 伦茨8400变频器面板按键说明_国产变频器按键的各个功能
  9. 初用mescroll-uni
  10. 利用pytesseract进行图片文字识别
  11. matlab仿真高尔顿正态分布源码,杂谈 | 正态分布为什么如此常见
  12. blender反选快捷键_【PS】常用操作及快捷键
  13. 区块链骗局盘点,有人暴富,有人破产
  14. 光滑的圆环(glossy torus)
  15. ios 拍照人像识别_Google相册为iOS用户添加了人像深度编辑和色彩弹出功能
  16. 你的数字生活:如何转变为一个个0和1?
  17. eclips开发工具的使用
  18. 福利:工作经常用到的Mac软件整理(全)
  19. 【01】花卉识别-基于tensorflow2.3实现
  20. 安装多个Vivado版本后,双击.xpr如何启动最新版本

热门文章

  1. Intel Realsense D435i Firmware Update
  2. 图片上传到七牛云存储空间
  3. 基于ESP32-CAM 和 OpenCV 设计的手势控制虚拟鼠标
  4. java抓取七麦app排行榜单数据 导出excel-20211201
  5. 工作记录|在PyTorch下读取GloVe向量
  6. U盘装系统装了一半就装不了 U盘装系统失败了怎么办
  7. 脑洞大开:为啥帧率达到 60 fps 就流畅?
  8. 如何查询网址的图片地址(下载瓦片地图用)
  9. Revit 2016 笔记07
  10. java中按位异或(XOR)运算