本文共 8179 字,大约阅读时间需要 27 分钟。
一、引言
学习Redis也有一段时间了,感触还是颇多的,但是自己很清楚,路还很长,还要继续。上一篇文章简要的介绍了如何在Linux环境下安装Lua,并介绍了在Linux环境下如何编写Lua脚本和运行。由于我们这个系列是以Redis为主,所以也介绍了Redis和Lua如何进行整合、运行。 在Lua脚本中有一个很重要的数据类型,那就是table类型,大家可以把Lua的table类型暂时理解为数组,只是Lua的table类型的下标可以是数字,可以是字符,除了(nil)类型,其他类型都可以做为table类型的下标。我们在使用Redis和Lua的过程中,比较多的会用到这个table类型,今天的主要任务就是介绍table类型的使用、CJSON的解析和如何通过C#语言来对Redis和Lua的进行整合操作。后续我还会推出针对Lua脚本语法的文章来扩充这个系列。二、Lua简介 Lua 是一个小巧的脚本语言。其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。 在Redis中使用Lua有很多好处,它可以减少网络开销,把多个操作一次性打包执行。Lua脚本天生支持原子性的操作,避免开启第三方事务,提高了性能。代码重用也是一个重要的好处,写好的代码会被加载到Redis内存中,可以供其他客户端使用,减少重复劳动。Lua脚本使用C语言写成的,执行速度很快,并天然具有可移植性,也是代码重用的很好体现。一个完整的Lua解释器,不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。三、基本操作 1、在Linux环境下安装CJSON和简单使用 cjson是一个类型转换工具类,可以把一个字符串转换为Lua的类型,如果类型嵌套多层,还可以转换为Lua的table类型,所以这个工具很重要,在编写Lua脚本的过程中经常使用,所以我们先来介绍cjson这个工具类的安装和使用。 1.1、下载CJSON软件包,官网地址:https://www.kyne.com.au/~mark/software/lua-cjson.php。[root@linux cjson]# pwd /root/software/download/cjson [root@linux cjson]# wget https://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
1.2、解压到当前目录,当然也可以解压到其他目录,解压到其他目录,比如:/usr/local,命令如下:tar zxvf lua-cjson-2.1.0.tar.gz -C(大写的) /usr/local
//当前目录 [root@linux cjson]# pwd /root/software/download/cjson //显示当前目录下的文件和目录 [root@linux cjson]# ls lua-cjson-2.1.0.tar.gz //解压到当前目录 [root@linux cjson]# tar zxvf lua-cjson-2.1.0.tar.gz [-C /usr/local] //... complete!
解压成功后的目录结构:
1.3、进入到解压目录的根目录,准备修改Makefile文件,用vim打开的修改文件的时候,注意名称大小写拼写正确。//当前目录 [root@linux cjson]# pwd /root/software/download/cjson //进入到CJSON的解压根目录 [root@linux cjson]# cd lua-cjson-2.1.0 //进入到根目录,修改Makefile文件 [root@linux lua-cjson-2.1.0]# vim Makefile
1,4、vim 进入Makefile文件,修改PREFIX选项,修改完毕,按ESC按钮,再按:,最后按wq,保存退出。
//当前目录 [root@linux lua-cjson-2.1.0]# pwd /root/software/download/cjson/lua-cjson-2.1.0
1.5、使用make命令在解压文件的根目录下进行编译。
//当前目录 [root@linux lua-cjson-2.1.0]# pwd /root/software/download/cjson/lua-cjson-2.1.0 [root@linux lua-cjson-2.1.0]# make //开始编译
1.6、最后使用 make install 安装cjson软件包。
//当前目录 [root@linux lua-cjson-2.1.0]# pwd /root/software/download/cjson/lua-cjson-2.1.0 [root@linux lua-cjson-2.1.0]# make install //开始安装
1.7、cjson.so文件很重要,是核心运行文件,如果出现错误,在某某目录没有找到cjson这个文件,就在其他目录找到,并拷贝到目标目录,可以解决所出现的错误。
[root@linux program]# pwd /root/application/program //拷贝sjson.so文件到指定目录 [root@linux program]# sudo cp -r cjson/lib/lua/5.1/cjson.so /usr/local/lib/lua/5.3
只需要把cjson.so文件拷贝到【/usr/local/lib/lua/5.3(这个版本具体情况要看具体情况)/】目录下就可以了
1.8、安装完成,开始测试cjson安装是否成功,此步骤有两步,必须全部都完成。//1、从Linux命令行模式进入lua命令行测试安装是否正确 [root@linux lua-cjson-2.1.0]# lua Lua 5.3.4 Copyright (C) 1994-2017 Lua.org PUC-Rio >local cjson=require("cjson") >local cjson2=require "cjson.safe" //以上所有操作没有提示任何错误 //2、我们在Linux命令行下在执行lua命令,执行lua脚本,测试是否安装成功 //05.lua脚本文件的源码 local cjson=require "cjson" local smapleJson=[[{"age":"23","testArray":{"array":[8,9,1,14,15]},"baidu":"www.baidu.com"}]]; local data=cjson.decode(sampleJson) print(data["age"]); print(data["testArray"]["array"][1]) //没有提示任何错误,安装成功 //在Linux环境下执行刚才的Lua脚本 [root@linux lua-cjson-2.1.0]# lua /root/application/program/luascript/05.lua 23 8.0 //安装成功
2、在Linux环境下,在Lua脚本里面使用cjson来解析类型。
1 //cjsonDemo.lua的源代码如下: 2 3 local cjson = require "cjson" 4 local retTable = {}; --最终产生json的表 5 6 --顺序数值 7 8 local intDatas = {}; 9 intDatas[1] = 100;10 intDatas[2] = "100";11 12 --数组13 14 local aryDatas = {};15 aryDatas[1] = {};16 aryDatas[1]["键11"] = "值11";17 aryDatas[1]["键12"] = "值12";18 aryDatas[2] = {};19 aryDatas[2]["键21"] = "值21";20 aryDatas[2]["键22"] = "值22";21 22 --对Table赋值23 24 retTable["键1"] = "值1";25 retTable[2] = 123;26 retTable["int_datas"] = intDatas;27 retTable["aryDatas"] = aryDatas;28 29 --将表数据编码成json字符串30 31 local jsonStr = cjson.encode(retTable);32 print(jsonStr);33 34 return retTable;35 36 //以上为Lua源码
//开始执行命令 [root@linux luascript]# pwd /root/application/program/luascript //lua脚本存放的位置 [root@linux luascript]# lua cjsonDemo.lua {"int_datas":[100,"100"],"2":123,"键1":"值1","aryDatas":[{"键12":"值12","键11":"值11"},{"键21":"值21","键22":"值22"}]}
//源码如下: local retTable = {}; --最终产生json的表 --顺序数值 local intDatas = {}; intDatas[1] = 100; intDatas[2] = "100"; --数组 local aryDatas = {}; aryDatas[1] = {}; aryDatas[1]["键11"] = "值11"; aryDatas[1]["键12"] = "值12"; aryDatas[2] = {}; aryDatas[2]["键21"] = "值21"; aryDatas[2]["键22"] = "值22"; --对Table赋值 retTable["键1"] = "值1"; retTable[2] = 123; retTable["int_datas"] = intDatas; retTable["aryDatas"] = aryDatas; return retTable;
using LuaInterface; // 引入的dll using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpPinvokeLuaDemo { class Program { static void Main(string[] args) { // 新建一个Lua解释器,每一个Lua实例都相互独立, 一个global全局域 Lua lua = new Lua(); //--------------------------------------------------- // Lua的索引操作[]可以创建、访问、修改global域 lua["age"] = 20; lua["name"] = "Mr.huang"; string luaCode = "print(\"This is Lua code\")"; lua.DoString(luaCode);//执行lua脚本代码 object[] result=lua.DoFile(@"C:\Users\Administrator\Desktop\Redis\LuaScript\cjsonDemo.lua");//执行lua脚本文件,这里我直接用了绝对定位 double age = (double)lua["age"]; Console.WriteLine("age = {0}", age); Console.WriteLine("width = {0}", lua["width"]); Console.ReadKey(); } } }
转载地址:http://syukz.baihongyu.com/