、前言

从本章节开始我们就开始讲解一些 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 的控制台

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

2、Lua 脚本中调用 Redis 命令

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

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

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 摘要,如下所示:

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

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

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

Redis+LUA整合使用的更多相关文章

  1. SSH框架和Redis的整合(1)

    一个已有的Struts+Spring+Hibernate项目,以前使用MySQL数据库,现在想把Redis也整合进去. 1. 相关Jar文件 下载并导入以下3个Jar文件: commons-pool2 ...

  2. redis lua

    需求是在缓存最近一周内用户所有消息列表,考虑用Redis 存储:为每个存储一个独立Sorted Set,value 为消息体,Score 为MessageId,用以实现增量消息同步. 问题就来了:So ...

  3. spring和redis的整合

    spring和redis的整合-超越昨天的自己系列(7) 超越昨天的自己系列(7) 扯淡:  最近一直在慢慢多学习各个组件,自己搭建出一些想法.是一个涉猎的过程,慢慢意识到知识是可以融汇贯通,举一反三 ...

  4. 像调试java一样来调试Redis lua

    高并发的系统中,redis的使用是非常频繁的,而lua脚本则更是锦上添花.因为lua脚本本身执行的时候是一个事务性的操作,不会掺杂其他外部的命令,所以很多关键的系统节点都会用redis+lua来实现一 ...

  5. 【Spring】17、spring cache 与redis缓存整合

    spring cache,基本能够满足一般应用对缓存的需求,但现实总是很复杂,当你的用户量上去或者性能跟不上,总需要进行扩展,这个时候你或许对其提供的内存缓存不满意了,因为其不支持高可用性,也不具备持 ...

  6. Redis Lua脚本调试

    从版本3.2开始,Redis包含一个完整的Lua调试器,可以用来使编写复杂Redis脚本的任务更加简单. 由于Redis 3.2仍处于测试阶段,请unstable从Github 下载Redis 的分支 ...

  7. springboot+shiro+redis(单机redis版)整合教程-续(添加动态角色权限控制)

    相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(单机redis版)整合教程 3. springboot+shiro+redis(集群re ...

  8. springboot+shiro+redis(集群redis版)整合教程

    相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(单机redis版)整合教程 3.springboot+shiro+redis(单机red ...

  9. springboot+shiro+redis(单机redis版)整合教程

    相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(集群redis版)整合教程 3.springboot+shiro+redis(单机red ...

随机推荐

  1. python实现自动发邮件

    Python有两个内置库:smtplib和email,可以实现邮件功能,无需下载,直接import导入. smtplib库负责发送邮件 Email库负责构造邮件格式和内容 邮件发送需要遵守SMTP协议 ...

  2. Struts2中的开启AsyncContext的方法

    //获取到requestHttpServletRequest req = ServletActionContext.getRequest();//设置属性org.apache.catalina.ASY ...

  3. this作为构造函数时注意点

    在 JS 中,为了实现类,我们需要定义一些构造函数,在调用一个构造函数的时候加上 new 这个关键字: function Person(name) { this.name = name; consol ...

  4. react-admin-plus 正式开源, 欢迎star

    简介 基于react.ant-ui.typescript的前端微服务框架.欢迎star. 在线地址 在线demo 项目介绍   沉淀了几个月的时间,这款框架终于正式的和大家见面了!   先说一下我做这 ...

  5. SPFA算法优化

    前言 \(SPFA\) 通常在稀疏图中运行效率高于 \(Dijkstra\) ,但是也容易被卡. 普通的 \(SPFA\) 时间复杂度为 \(O(km)\) ,其中 \(k\) 是一条边松弛其端点点的 ...

  6. eclipse 搭建连接 activemq

    今天我特地写下笔记,希望可以完全掌握这个东西,也希望可以帮助到任何想对学习这个东西的同学. 1.下载activemq压缩包,并解压(如果需要下载请看文章尾部附录) 2.进入bin文件夹,(64位电脑就 ...

  7. 【面试专栏】JAVA锁机制

    1. 悲观锁 / 乐观锁   在Java和数据库中都存在悲观锁和乐观锁的应用.Mysql锁机制中的悲观锁和乐观锁请查看:   Mysql锁机制--悲观锁和乐观锁   悲观锁:在获得数据时先加锁,只到数 ...

  8. ssh-copy-id三步实现SSH免密登录

    背景 在日常工作中,不希望每次登录都输入密码,这里主要介绍一种简单的配置Linux主机间免密登录的方式 先了解两个核心命令: ssh-keygen :产生公钥和私钥对 ssh-copy-id:将北极的 ...

  9. pytorch和tensorflow的爱恨情仇之一元线性回归例子(keras插足啦)

    直接看代码: 一.tensorflow #tensorflow import tensorflow as tf import random import numpy as np x_data = np ...

  10. 自顶向下redis4.0(5)持久化

    redis4.0的持久化 目录 redis4.0的持久化 简介 正文 rdb持久化 save命令 bgsave命令 rdb定期保存数据 进程结束保存数据 aof持久化 数据缓冲区 刷新数据到磁盘 ap ...