zoukankan      html  css  js  c++  java
  • Redis+LUA整合使用

    、前言

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

  • 相关阅读:
    SQL分页存储过程——表名、返回的列、排序字段、排序类型、条件、页尺寸、页码
    SQL——触发器——插入触发器——边学边项目写的。
    SQL链表查询 数据库为空
    【错误积累】更新失败,数据包解压时出现错误!
    VS使用技巧(转)
    命令模式
    代理模式
    模板方法模式
    享元模式
    MongoDB 分片2
  • 原文地址:https://www.cnblogs.com/zhangfengshi/p/12450186.html
Copyright © 2011-2022 走看看