Redis Lua脚本原理
时间:2022-04-22
本文章向大家介绍Redis Lua脚本原理,主要内容包括Lua脚本执行过程、环境协作组件、lua_scripts字典、EVAL命令的实现、通过函数保存传入的脚本好处:、准备执行脚本:、脚本管理命令实现、脚本的复制、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
2.6版本之后支持嵌入Lua脚本,客户端使用Lua脚本,直接在服务器端原子的执行多条命令
Lua脚本执行过程
创建并修改Lua环境
- 1 创建基础Lua环境
- 2 载入函数库
- 3 创建全局表格Lua
- 4 替换随机函数
- 5 创建排序辅助函数
- 6 创建redis.pcall函数
- 7 全局环境保护
- 8 修改后的Lua环境保存到服务器状态的Lua属性,等待脚本执行
Redis中带有不确定性的命令:
SINTER
SUNION
SDIFF
SMEMEBERS
HKEYS
HVALS
KEYS
注意:
- Redis提供了排序函数,使用上述命令后,会返回相同的排序结果
- Redis确保检查创建变量时,添加local等参数,但是没有禁止修改已经存在的全局变量,因此使用时应谨慎。
- 由于Redis使用串行化的方式执行,因此某一特定时间,只有一个脚本能被放进Lua环境里面运行。
环境协作组件
环境组件:
- 一个是用于执行Lua脚本的伪客户端
- 一个用于保存Lua脚本的字典。
执行Lua脚本的伪客户端
使用redis.call或者redis.pcall执行Redis命令:
- 1 将redis.call或者redis.pcall传给伪客户端
- 2 伪客户端将执行的命令传给执行器
- 3 执行器执行命令,返回给伪客户端
- 4 伪客户端把结果返回给Lua环境
- 5 Lua环境把结果返回给redis.call或者redis.pcall函数
- 6 redis.call或者redis.pcall返回结果给调用者
lua_scripts字典
保存Lua脚本的SHA1【校验和】checksum,值是对应的脚本。Redis会把EVAL命令执行过的脚本,或者SCRIPT LOAD加载的脚本都保存在字典中。
字典的作用:实现SCRIPT EXISTS命令;实现脚本的复制
EVAL命令的实现
- 1 根据客户端给定的脚本,在Lua环境中定义Lua函数
- 2 将客户端给定的脚本保存到lua_scripts字段,进一步使用
- 3 执行刚刚在lua中定义的函数,执行客户端给定的lua脚本
通过函数保存传入的脚本好处:
- 1 执行方便
- 2 保持局部性
- 3 如果定义过一次,只要使用校验和即可。
准备执行脚本:
- 1 将EVAL命令传入的键名参数和脚本参数保存在KEYS数组和ARGV数组中
- 2 装载超时钩子
- 3 执行脚本函数
- 4 移除钩子
- 5 结果放入缓冲区
- 5 垃圾回收
使用EVALSHA “xxx校验和”0 就可执行EVAL "return 'hello world!'" 0
脚本管理命令实现
SCRIPT FLUSH 用于清除服务器中lua有关的脚本,释放lua_scripts字典,关闭现有的lua环境,并重新创建
SCRIPT EXISTS 输入SHA1校验和,判断是否存在
SCRIPT LOAD 与EVAL相同,创建对应的lua函数,存放到字典中
SCRIPT KILL 使用钩子定期检查脚本运行时间,如果没有执行过,可以使用SCRIPT KILL杀掉;如果执行过,只能使用SHUTDOWN nosave停止服务器
脚本的复制
相同的EVALSHA复制操作,从服务器有可能找不到
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”
- 「零门槛多语言 Python/C/C# 通用思想学习系列」第一篇:经典HelloWorld
- 直播系统定制,判断数据连接是否可用
- VS Code 编辑器入门指南上篇-核心概念与组件
- Python turtle库实现基本剖析
- python thinker canvas create_arc 使用详解
- Python3 实现单例设计模式
- Python3 实现建造者模式
- python 实现原型设计模式
- python 最简单的实现适配器设计模式
- python3 最基本且简单的实现组合设计模式
- python 实现装饰器设计模式
- 看得懂的外观设计模式 python3 实现
- 看得懂的设计模式 享元模式python3 最基本(简单)实现
- python3 最简单的实现 模版设计模式