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命令。

  • 相关阅读:
    Python 安装Twisted 提示python version 2.7 required,which was not found in the registry
    Openfire Strophe开发中文乱码问题
    css div 垂直居中
    How to create custom methods for use in spring security expression language annotations
    How to check “hasRole” in Java Code with Spring Security?
    Android 显示/隐藏 应用图标
    Android 当媒体变更后,通知其他应用重新扫描
    文件上传那些事儿
    专题:点滴Javascript
    主流动画实现方式总结
  • 原文地址:https://www.cnblogs.com/liushijie/p/5095444.html
Copyright © 2011-2022 走看看