龙空技术网

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

数据仓库 126

前言:

现在我们对“java调用lua脚本”都比较看重,看官们都需要了解一些“java调用lua脚本”的相关知识。那么小编同时在网摘上网罗了一些对于“java调用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 的函数指针

标签: #java调用lua脚本