非关系型数据库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 的函数指针
我知道你在看哟