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 服务器的需要。这个过程由以下步骤组成:
- 创建一个基础的 Lua 环境。
- 载入多个函数库到 Lua 环境里。让 Lua 脚本可以使用这些函数库来进行数据操作。
- 创建全局表格 redis,这个表格包含了对 Redis 进行操作的函数,从而避免在脚本中引入副作用。
- 使用 Redis 自带的随机函数来替换 Lua 原有的带有副作用的随机函数。
- 创建排序辅助函数,Lua 环境使用这个辅助函数来对一部分 Redis 命令的结果进行排序,从而消除这些命令的不确定性。
- 创建 redis.pcall 函数的错误报告辅助函数,这个函数可以提供更详细的出错信息。
- 对 Lua 环境中的全局环境进行保护,反之用户在执行 Lua 脚本的过程中,将额外的全局变量添加到 Lua 环境中。
- 将完成修改的 Lua 环境保存到服务器状态的 Lua 属性中,等待执行服务器传来的 Lua 脚本。
Lua 环境协作组件
Redis服务器创建了两个用于与 Lua 环境进行协作的组件,它们分别负责执行 Lua 脚本中的 Redis 命令的伪客户端,和用于保存 Lua 脚本的 lua_scripts 字典。
eval 命令的实现
eval 命令的执行过程可以分为以下三个步骤:
- 根据客户端给定的 Lua 脚本,在 Lua 环境中定义一个 Lua 函数。
- 将客户端给定的脚本保存到 lua_scripts 字典,等待将来进一步使用。
- 执行刚刚在 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命令。
Redis学习笔记六:独立功能之 Lua 脚本的更多相关文章
- Redis学习笔记(三)使用Lua脚本实现分布式锁
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行. 使用Lua脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放 ...
- Redis学习笔记六:持久化实验(AOF,RDB)
作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- (转)redis 学习笔记(1)-编译、启动、停止
redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...
- Redis学习笔记(2)——Redis的下载安装部署
一.下载Redis Redis的官网下载页上有各种各样的版本,如图 但是官网下载的Redis项目不正式支持Windows.如果需要再windows系统上部署,要去GitHub上下载.我下载的是Redi ...
- redis 学习笔记-cluster集群搭建
一.下载最新版redis 编译 目前最新版是3.0.7,下载地址:http://www.redis.io/download 编译很简单,一个make命令即可,不清楚的同学,可参考我之前的笔记: red ...
- Redis学习笔记4-Redis配置具体解释
在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redi ...
随机推荐
- p:commandButton vs h:commandButton
同样的语句,换成primefaces就不刷新页面了.原来p的支持ajax.需要显示指定刷新全部页面.郁闷了一天了. <p:commandButton id="SearchTop&quo ...
- java Base64算法的使用
Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public c ...
- JZOJ 1312:关灯问题
传送门 少见的DP再DP题目.题面不短,但是可以看出来这是一道DP题.而且正解的算法复杂度应该是$O(N^3)$.而且给了部分$O(N^4)$的算法的分.可以看出来要AC是要在DP上加上优化的. 设$ ...
- spring--学习之IOC DI
2.1.1 IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器 ...
- cobbler重装、web、定制化
cobbler重装 根据此文已自动化安装centos 7的版本http://www.cnblogs.com/shhnwangjian/p/5858900.html 在cobbler-test主机上重装 ...
- XmlHttpRequest对象的获取及相关操作
一.获取XMLHttpRequest对象 方案一: function ajaxFunction(){ var xmlHttp; try{ // Firefox, Opera 8.0+, Safari ...
- PHP中常用的字符串格式化函数总结
注意:在PHP中提供的字符串函数处理的字符串,大部分都不是在原字符串上修改,而是返回一个格式化后的新字符串. 一.取出空格和字符串填补函数 空格也是一个有效的字符,在字符串中也会占据一个位置.用户在表 ...
- try throw catch
#include "stdafx.h" #include <iostream> #include <stdlib.h> using namespace st ...
- linux常用快捷键
linux常用快捷键:ctrl+c 强制终止当前命令ctrl+l 清屏ctrl+a 光标移动到命令行首ctrl+e 光标移动到命令行尾ctrl+u 从光标合所在的位置删除到行首ctrl+z 把命令放到 ...
- Linux学习笔记(二)2015.4.14
笔记2.1 Q:登陆命令 A:刚开始登陆的是安装Linux时设置的普通用户,如lin,输入su - root后,成为root用户 笔记2.2 Q:切换控制台 A:ctrl+alt+F1-F7可以切 ...