Redis Lua脚本原理
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复制操作,从服务器有可能找不到
Redis Lua脚本原理的更多相关文章
- Redis Lua脚本调试
从版本3.2开始,Redis包含一个完整的Lua调试器,可以用来使编写复杂Redis脚本的任务更加简单. 由于Redis 3.2仍处于测试阶段,请unstable从Github 下载Redis 的分支 ...
- Redis Lua脚本完全入门
1. 前言 Redis是高性能的KV内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO地理位置信息计算.Redis提供了丰富的命令来供我们使用以实现一些计算.R ...
- Redis Lua 脚本使用
本文转载自Redis Lua 脚本使用 Lua 简介 Lua语言提供了如下几种数据类型:booleans(布尔).numbers(数值).strings(字符串).tables(表格). 下面是一些 ...
- 在Spring中使用Redis Lua脚本批量删除缓存
背景 之前分享了一篇利用lua脚本批量删除redis的key的文章.现在项目中我打算使用spring的缓存,而Spring缓存以前我是用ehcache来做实现的.没发现什么问题..这次我换成redis ...
- 【连载】redis库存操作,分布式锁的四种实现方式[四]--基于Redis lua脚本机制实现分布式锁
一.redis lua介绍 Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题.Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向 ...
- redis --- lua 脚本实现原子操作
如题, 楼主的想法很简单, lua 脚本本身支持原子性, 所以把命令写进一个脚本就行, 当然后续还会优化才能放到生产上,例如缓存脚本 ,redis 本身会缓存执行过的脚本 ,这样速度更快, 再优化, ...
- Redis进阶应用:Redis+Lua脚本实现复合操作
一.引言 Redis是高性能的key-value数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充.得益于超高性能和丰富的数据结构,Re ...
- redis lua脚本学习
语法格式(常见) a = 5 -- 全局变量 local b = 5 -- 局部变量 Eval的使用 EVAL script numkeys key [key ...] arg [arg ...] 首 ...
- redis>lua脚本
String lua="local num=redis.call('incr',KEYS[1])\n"+"if tonumber(num)==1 then\n" ...
随机推荐
- Xamarin.Android绑定库分享
使用Xamarin.Android时,会用到各种第三方库,而这些库基本上是java编写的,要在Xamarin.Android中使用这些库,就需要通过Android Binding Project绑定对 ...
- Web Essentials之JavaScript,TypeScript和CoffeeScript
返回Web Essentials功能目录 一些Javascript功能也可以用于TypeScript. 本篇目录 功能 智能提示 TypeScript CoffeeScript 功能 JSHint J ...
- vCPU估算的几个基本概念
物理CPU数量:实际服务器插槽上的CPU个数: 核:一块CPU上面能处理数据的芯片组的数量: 超线程:在一个实体芯片组中提供两个逻辑线程: 逻辑CPU数量:物理CPU数量*核*超线程(若支持超线程,该 ...
- LuaAlchemy API 介绍
The AS3 Sugar provides a Lua-like way to access AS3 class and instance creation, property getter/set ...
- Open Source Cassandra Gitbook for Developer
Just released an open source Cassandra Gitbook for developer. http://teddymaef.github.io/learncassan ...
- IOS 基础-define、const、extern、全局变量
这里介绍一下define.const.extern的用法.优劣以及要注意的地方. 1.define 宏define是定义一个变量,没有类型信息.define定义的常量在内存中有若干个拷贝. defin ...
- Atitit 颜色平均值cloor grb hsv模式的区别对比
Atitit 颜色平均值cloor grb hsv模式的区别对比 使用hsv模式平均后会变得更加的靓丽一些..2 public class imgT { public static void main ...
- 【管理心得之三十二】PMP杂谈---------爱情必胜术
这次一反常态,没有场景设计,我想借此文普及一下PMP是什么? 但我不知道这样枯燥的话题能否能引起你的兴趣,我不得不套用“标题党”<爱情必胜术>来博你眼球. 我真没有说谎,此文是献给那些孤身 ...
- 更新日志 - fir.im 新版优化上线
经过这段时间的用户反馈收集和新版本的功能调研,我们对 fir.im Rio 上传下载.应用管理再次做了调整优化.感谢之前内测用户的反馈与建议.目前 fir.im Rio 新版已正式上线,主要优化有以下 ...
- CKEditor与CKFinder整合 MVC3
今天偶然看到一篇关于 CKEditor与CKFinder整合文章,心想有一段时间没有使用这种东西了.于是乎自己动手亲自体验了一下,本以为简单但在东西编写的过程发现了很多没有遇见毛病. 所以记录一下自己 ...