zoukankan      html  css  js  c++  java
  • Redis学习笔记六:独立功能之 Lua 脚本

    Redis 2.6 开始支持 Lua 脚本,通过在服务器环境嵌入 Lua 环境,Redis 客户端中可以原子地执行多个 Redis 命令。
    使用 eval 命令可以直接对输入的脚本求值:

    127.0.0.1:6379> eval 'return "liushijie"' 0
    "liushijie"
    

    使用 evalsha 命令则可以根据脚本的 sha1 校验和对脚本进行求值,但是这个命令至少被 eval 命令执行过一次或被 script load 命令载入过。

    创建并载入 Lua 环境

    为了在 Redis 服务器中执行 Lua 脚本,Redis 在服务器内嵌了一个 Lua 环境,并对这个环境进行了一系列的修改,从而确保 Lua 环境可以满足 Redis 服务器的需要。这个过程由以下步骤组成:

    1. 创建一个基础的 Lua 环境。
    2. 载入多个函数库到 Lua 环境里。让 Lua 脚本可以使用这些函数库来进行数据操作。
    3. 创建全局表格 redis,这个表格包含了对 Redis 进行操作的函数,从而避免在脚本中引入副作用。
    4. 使用 Redis 自带的随机函数来替换 Lua 原有的带有副作用的随机函数。
    5. 创建排序辅助函数,Lua 环境使用这个辅助函数来对一部分 Redis 命令的结果进行排序,从而消除这些命令的不确定性。
    6. 创建 redis.pcall 函数的错误报告辅助函数,这个函数可以提供更详细的出错信息。
    7. 对 Lua 环境中的全局环境进行保护,反之用户在执行 Lua 脚本的过程中,将额外的全局变量添加到 Lua 环境中。
    8. 将完成修改的 Lua 环境保存到服务器状态的 Lua 属性中,等待执行服务器传来的 Lua 脚本。

    Lua 环境协作组件

    Redis服务器创建了两个用于与 Lua 环境进行协作的组件,它们分别负责执行 Lua 脚本中的 Redis 命令的伪客户端,和用于保存 Lua 脚本的 lua_scripts 字典。

    eval 命令的实现

    eval 命令的执行过程可以分为以下三个步骤:

    1. 根据客户端给定的 Lua 脚本,在 Lua 环境中定义一个 Lua 函数。
    2. 将客户端给定的脚本保存到 lua_scripts 字典,等待将来进一步使用。
    3. 执行刚刚在 Lua 环境中定义的函数,以此来执行客户端给定的 Lua 脚本。

    evalsha 命令的实现

    每个被 evlal 命令执行过的 Lua 脚本,在 Lua 环境里面都有个对这个脚本对应的 Lua 函数, 函数的名字由 f_ + sha1 校验和组成。

    脚本管理命令的实现

    除了 eval 和 evalsha 命令之外,还有四个 Lua 脚本相关的命令,它们分别是 script flush、script exists、script load、script kill。

    script flush
    用于清除服务器中所有和 Lua 脚本有关的信息,会释放 lua_scripts 字典,关闭现有的 Lua 环境并重新创建一个新的 Lua 环境

    script exists
    根据输入的 sha1 校验和,检查校验和对应的脚本是否存在与服务器中。

    script load
    命令首先在 Lua 环境中为脚本创建相对应的函数,然后再将脚本保存到 lua_scripts 字典里。

    script kill
    如果服务器设置 lua-time-limit 配置选项,每次在执行 Lua 脚本之前,服务器都会在 Lua 环境里设置一个超时处理钩子。如果超时并且收复制到 script kill 命令或 shutdown 命令,则停止字火星这个脚本,并向执行该脚本的客户端发送一个错误回复。

    脚本复制

    当服务器运行在复制模式下,具有写性质的脚本命令也会被复制到从服务器,这些命令包括 eval、evalsha
    、script flush、script load命令。

  • 相关阅读:
    jquery跨域解决方案JSONP
    javascript的执行顺序
    事件委托
    JSONP解决跨域完整例子
    javascript数组&省市联动分别用js数组和JSON实现
    快速排序
    闭包
    如何解决linux的ssh连接自动断开的问题
    Django 单元测试(简单例子)
    源代码格式化工具推荐(coolformat),可以实现c,c++,c#,java,js,json,html,sql等的格式化
  • 原文地址:https://www.cnblogs.com/liushijie/p/5095444.html
Copyright © 2011-2022 走看看