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脚本原理的更多相关文章

  1. Redis Lua脚本调试

    从版本3.2开始,Redis包含一个完整的Lua调试器,可以用来使编写复杂Redis脚本的任务更加简单. 由于Redis 3.2仍处于测试阶段,请unstable从Github 下载Redis 的分支 ...

  2. Redis Lua脚本完全入门

    1. 前言 Redis是高性能的KV内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO地理位置信息计算.Redis提供了丰富的命令来供我们使用以实现一些计算.R ...

  3. Redis Lua 脚本使用

    本文转载自Redis Lua 脚本使用 Lua 简介 Lua语言提供了如下几种数据类型:booleans(布尔).numbers(数值).strings(字符串).tables(表格). 下面是一些 ...

  4. 在Spring中使用Redis Lua脚本批量删除缓存

    背景 之前分享了一篇利用lua脚本批量删除redis的key的文章.现在项目中我打算使用spring的缓存,而Spring缓存以前我是用ehcache来做实现的.没发现什么问题..这次我换成redis ...

  5. 【连载】redis库存操作,分布式锁的四种实现方式[四]--基于Redis lua脚本机制实现分布式锁

    一.redis lua介绍 Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题.Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向 ...

  6. redis --- lua 脚本实现原子操作

    如题, 楼主的想法很简单, lua 脚本本身支持原子性, 所以把命令写进一个脚本就行, 当然后续还会优化才能放到生产上,例如缓存脚本 ,redis 本身会缓存执行过的脚本 ,这样速度更快, 再优化, ...

  7. Redis进阶应用:Redis+Lua脚本实现复合操作

    一.引言 Redis是高性能的key-value数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充.得益于超高性能和丰富的数据结构,Re ...

  8. redis lua脚本学习

    语法格式(常见) a = 5 -- 全局变量 local b = 5 -- 局部变量 Eval的使用 EVAL script numkeys key [key ...] arg [arg ...] 首 ...

  9. redis>lua脚本

    String lua="local num=redis.call('incr',KEYS[1])\n"+"if tonumber(num)==1 then\n" ...

随机推荐

  1. Jexus web server V5.4.5 已经发布

    Jexus 是运行于 Linux/FreeBSD 平台的一款以支持 ASP.NET 为主要特色的,同时非常重视安全性和稳定性的高性能 WEB 服务器.最新版 5.4.5 已经发布,官方网站是:www. ...

  2. Smack 3.3.1 发布,Java 的 XMPP 开发包

    Smack 3.3.1 发布了,这是一个小更新版本,主要更新包括: [SMACK-441] - Memory leak in KeepAliveManager [SMACK-447] - Compre ...

  3. 深入理解Ember-Data特性(下)

    写在前面 最近比较忙,换了新工作还要学习很多全新的技术栈,并给自己找了很多借口来不去坚持写博客.常常具有讽刺意味的是,更多剩下的时间并没有利用而更多的是白白浪费,也许这就是青春吧,挥霍吧,这不是我想要 ...

  4. 003. Asp.Net Routing与MVC 之一: 请求如何到达MVC

    基础知识 本文用到的基础知识:URL.HttpModule 与 HttpHandler.IIS 的请求处理过程. URL HttpModule与HttpHandler IIS7.0的请求处理过程 OK ...

  5. Asp.net下使用HttpModule模拟Filter,实现权限控制

    在asp.net中,我们为了防止用户直接从Url中访问指定的页面而绕过登录验证,需要给每个页面加上验证,或者是在模板页中加上验证.如果说项目比较大的话,添加验证是一件令人抓狂的事情,本次,我就跟大家分 ...

  6. 移动APP的自动化测试

    开发移动应用,最耗时耗力的就是手动测试APP的每个功能点或修复bug.有人就会提议App的业务逻辑可以使用nUnit或xUnit测试单元来辅助完成.那用户界面要如何测试?众所周知,移动设备多种多样,数 ...

  7. 每天一个linux命令(54):ping命令

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...

  8. Java程序员的日常 —— 注册工厂的妙用

    注册工厂是一种很常用的框架书写方法,它适合于快速创建相同类型的对象. 举个栗子 比如一个家具工厂,有沙发.椅子.茶几等等,正常的编程模式是这样的: //创建 class 沙发{} class 椅子{} ...

  9. Java正则表达式应用详解

    如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单.如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字 ...

  10. 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面

    在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ...