Redis+LUA整合使用

Stella981
• 阅读 647

、前言

从本章节开始我们就开始讲解一些 Redis 的扩展应用了,之前讲的主从、哨兵和集群都相当重要,也许小公司用不到集群这么复杂的架构,但是也要了解各知识点的原理,只要了解了原理,无论什么时候是有,就都很容易上手了。本章节讲解一下 Redis + LUA 的整合,这里只能当做入门教程,讲解一下 Redis + LUA 相关命令,这里不会单独讲解 LUA 的命令,读者可在菜鸟教程上自行学习,文中会给出教程地址(感谢菜鸟教程整理如此详细的教程)。


二、LUA 简介与安装

1、什么是LUA(摘自百度百科)

Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo 所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua 由标准 C 编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua 并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的 JIT 项目,提供在特定平台上的即时编译功能。

2、Redis 中使用 LUA 的好处

1)减少网络开销,在 Lua 脚本中可以把多个命令放在同一个脚本中运行。

2)原子操作,Redis 会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件。

3)复用性,客户端发送的脚本会永远存储在 Redis 中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑。

3、LUA 的安装

1)下载地址:Lua:下载,下载完成后,上传到 Linux 服务器

2)安装

(1)需要先安装依赖环境:yum -y install readline-devel ncurses-devel

(2)解压下载好的 LUA 包:tar -zxvf lua-5.3.5.tar.gz

(3)进入到 lua-5.3.5 中,执行 make linux 命令

(4)执行 make install 命令

3)测试:安装完成后,直接输入 lua 命令即可进入 lua 的控制台

Redis+LUA整合使用

4、LUA 常见语法

这里不再讲 LUA 的语法知识了,内容比较多,可以根据下面的地址自行学习:

LUA 教程


三、Redis + LUA 整合使用

从 Redis2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL 命令对 LUA 脚本进行求值。(这种形式是不需要单独安装 LUA)

1、EVAL 命令

1)命令格式

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

2)命令说明

(1)script 参数:是一段 Lua 脚本程序,它会被运行在 Redis 服务器上下文中,这段脚本不必(也不应该)定义为一个 Lua 函数。

(2)numkeys 参数:用于指定键名参数的个数。

(3)key [key ...] 参数: 从 EVAL 的第三个参数开始算起,使用了 numkeys 个键(key),表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用1为基址的形式访问(KEYS[1],KEYS[2]···)。

(4)arg [arg ...]参数:可以在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似(ARGV[1],ARGV[2]···)。

3)示例

注意:这里使用的命令,是 Redis 提供的,所以是要连接上 Redis 实例的。

eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 name1 name2 AlanWorker AlanShelby

Redis+LUA整合使用

2、Lua 脚本中调用 Redis 命令

1)这里我们主要记住 call() 命令即可:

eval "return  redis.call('set',KEYS[1],'AlanShelby')" 1 name

Redis+LUA整合使用

3、EVALSHA 命令

1)EVAL 命令要求你在每次执行脚本的时候都发送一次脚本主体(script body)。

2)Redis 有一个内部的缓存机制,因此它不会每次都重新编译脚本,不过在很多场合,付出无谓的带宽来传送脚本主体并不是最佳选择。

3)为了减少带宽的消耗, Redis 实现了EVALSHA 命令,它的作用和 EVAL 一样,都用于对脚本求值,但它接受的第一个参数不是脚本,而是脚本的 SHA1 摘要。

4)EVALSHA 命令的表现如下

(1)如果服务器还记得给定的 SHA1 校验和所指定的脚本,那么执行这个脚本

(2)如果服务器不记得给定的 SHA1 校验和所指定的脚本,那么它返回一个特殊的错误,提醒用户使用 EVAL 代替 EVALSHA

5)那么,我们怎么来获取脚本的 SHA1 摘要呢?下面我们来看一下 SCRIPT 命令:

(1)SCRIPT FLUSH :清除所有脚本缓存。

(2)SCRIPT EXISTS :根据给定的脚本校验,检查指定的脚本是否存在于脚本缓存。

(3)SCRIPT LOAD :将一个脚本装入脚本缓存,返回SHA1摘要,但并不立即运行它。

(4)SCRIPT KILL :杀死当前正在运行的脚本。

这里的 SCRIPT LOAD 命令就可以用来生成脚本的 SHA1 摘要,如下所示:

Redis+LUA整合使用

这里我们获取了 "return redis.call('set',KEYS[1],ARGV[1])" 这段脚本的 SHA1 摘要,有了摘要,再使用这段脚本就十分简单了:

Redis+LUA整合使用

4、redis-cli --eval 命令

1)可以使用 redis-cli 命令直接执行脚本,这里我们直接新建一个 lua 脚本文件,用来获取刚刚存入 Redis 的 name1 的值,vim redis.lua,然后编写 Lua 命令:

local value = redis.call('get','name1')
return value

编写完成后,保存退出,执行命令:

./redis-cli -h 192.168.1.216 -p 6379 --eval redis.lua

Redis+LUA整合使用


四、小结

本章节讲解了 Redis + LUA 整合使用,有了 LUA,Redis 就犹如进化了一般,能够实现更多的功能,这个属于 Redis 的一个扩展知识点,希望读者看过之后能够了解什么是 LUA,LUA 的基础命令以及 Redis 中如何使用 LUA,读者了解到这些,这篇入门教程的目的就达到了。

摘自https://zhuanlan.zhihu.com/p/44912922

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这