vlambda博客
学习文章列表

非关系型数据库Redis之Lua脚本

点击蓝字关注我吧


【本文详细介绍了非关系型数据库Redis中Lua脚本的基本概念和使用方法,欢迎读者朋友们阅读、转发和收藏!】

1 Lua 简介

Lua 是一个小巧的脚本语言,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能,主要应用场景为:游戏开发、独立应用脚本、 Web 应用脚本、扩展和数据库插件和安全系统等。Lua 以可嵌入,轻量,高效,提升静态语言的灵活性,有了 Lua ,方便对程序进行改动或拓展,减少编译的次数,在游戏开发中特别常见。在 Java 中调用 Lua 脚本的例子如下:

import org.keplerproject.luajava.*;
public class Hello
{

public static void main(String[] args)
{
LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
System.out.println(" 这里是 Java 程序调用 Lua 脚本 ");
// 加载脚本 hello.lua, 并执行
L.LdoFile("res/hello.lua");
}
}

2 Redis 为什么添加 Lua 支持

Lua 为静态语言提供更多的灵活性, redislua 脚本出现之前 Redis 没有服务器端运算能力,主要是用来存储,用做缓存,运算是在客户端进行,有两个缺点:一、如此会破坏数据的一致性,二、浪费了数据传输的网络带宽。

Lua 出现之后问题得到了充分的解决,有了 Lua 的支持,客户端可以定义对键值的运算。总之,可以让 Redis 更为灵活。

3 Lua 环境的初始化

在 Redis 服务器初始化函数 scriptingInit() 中,初始化了 Lua 的环境。

  • 加载了常用的 Lua 库,方便在 Lua 脚本中调用

  • 创建 SHA1->lua_script 哈希表,可见 Redis 会保存客户端执行过的 Lua 脚本

SHA1 是安全散列算法产生的一个固定长度的序列,可以把它理解为一个键值。可见 Redis 服务器会保存客户端执行过的 Lua 脚本。这在一个 Lua 脚本需要被经常执行的时候是非常有用的。试想,客户端只需要给定一个 SHA1 序列就可以执行相应的 Lua 脚本。事实上, EVLASHA 命令就是这么工作的。


  • 注册 Redis 的一些处理函数,譬如命令处理函数,日志函数。注册过的函数,可以在 lua 脚本中调用

  • 替换已经加载的某些库的函数

  • 创建虚拟客户端( fake client ),和 AOF 、 RDB 数据恢复的做法一样,是为了复用命令处理函数

4 Lua 脚本执行 Redis 命令

要在 lua 脚本中调用 c 函数,会有以下几个步骤:

1. 定义下面的函数:typedef int (*lua_CFunction) (lua_State *L) ;

2. 为函数取一个名字,并入栈

3. 调用 lua_pushcfunction() 将函数指针入栈

4. 关联步骤 2 中的函数名和步骤 3 的函数指针

我知道你在看