Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
全局流量管理 GTM,标准版 1个月
简介: 原文:Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本一、引言         学习Redis也有一段时间了,感触还是颇多的,但是自己很清楚,路还很长,还要继续。
原文: Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本

一、引言

         学习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"}]}


          执行效果如图:
         
                 

    3、在Windows环境下,用C#执行lua脚本

            3.1、在VS2015中建一个C#控制台应用程序,并添加LuaInterface.dll的引用

                       LuaInterface下载地址:http://luaforge.net/projects/luainterface/ (下载luainterface-1.5.3,这里面的资源比较多)

                 LuaInterface.Lua类是CLR访问Lua解释器的主要接口,一个LuaInterface.Lua类对象就代表了一个Lua解释器(或Lua执行环境),Lua解释器可以同时存在多个,并且它们之间是完全相互独立的。
                   

           3.2、在Windows环境下,Lua脚本文件使用上面提到的源文件 cjsonDemo.lua。

                        文件所在地址如下:C:\Users\Administrator\Desktop\Redis\LuaScript\cjsonDemo.lua

                //源码如下:

                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;


         3.3、测试代码如下:

           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();
                   }
              }
         }


         3.4、有可能抛出的异常:FileLoadException,异常内容:其他信息: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

                 该问题解决不是很难,只要在配置文件里增加一点配置就能解决。配置代码如下:

                <startup useLegacyV2RuntimeActivationPolicy="true">
                    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
                    <supportedRuntime version="v2.0.50727"/>
                </startup>


              在原来.NET2.0,.NET3.5的时候,由于程序运行环境本质还是.NET2.0,而到了.NET4.0由于整个程序集的版本更新,以前使用.NET2.0所编写的程序集与.NET4.0的程序集继续互操作的时候就会出现上面所说的兼容性问题。通过MSDN,我们可以知道,startup配置节中的useLegacyV2RuntimeActivationPolicy属性是在.NET4.0中新增的,默认是false,表示:使用默认的 .NET Framework 4 激活策略,该激活策略将加载 .NET Framework 4 通过使用公共语言运行时 (CLR) 版本 4 所创建的程序集,以及 CLR 早期版本通过使用受支持的低于版本 4 的最高 CLR 版本所创建的程序集。

             现在如果当程序在.NET4.0环境下要使用.NET2.0及.NET3.5的程序时就必须将useLegacyV2RuntimeActivationPolicy设置为true,同时还要注意,需要在startup配置节的字节中添加supportedRuntime配置节,并指定为“v4.0”,表示使用.NET4.0运行时来运行程序。


四、结束

       今天就写到这里了,就给今天做一个总结吧。今天主要完成了lua-cjson在Linux下的安装和使用,当然也有出现问题的解决。同时也测试了在Linux环境下,在Lua脚本中使用cjson工具类完成table类型的解析。最后也测试了一下如何使用C#来调用lua脚本,并执行。但是有一个事情,还没做,就是在Windows环境下,如何在Lua脚本里使用lua-cjson来解析类型,里面涉及到的内容很多,一篇文章无法写完,只好把相关的东西放到下一片文章吧。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
8天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
27 3
|
1月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
119 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
18天前
|
存储 SQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
|
22天前
|
测试技术 C# 数据库
C# 一分钟浅谈:测试驱动开发 (TDD) 实践
【10月更文挑战第18天】测试驱动开发(TDD)是一种软件开发方法论,强调先编写测试代码再编写功能代码,以确保代码质量和可维护性。本文从 TDD 的基本概念入手,详细介绍了其核心步骤——编写测试、运行测试并失败、编写代码使测试通过,以及“红绿重构”循环。文章还探讨了 TDD 的优势,包括提高代码质量、促进设计思考、减少调试时间和文档化。此外,文中分析了常见问题及解决方案,如测试覆盖率不足、测试代码过于复杂、忽视重构和测试依赖过多,并通过一个简单的计算器类的代码案例,展示了 TDD 的实际应用过程。
32 1
|
27天前
|
监控 Linux 云计算
Linux操作系统在云计算环境中的实践与优化###
【10月更文挑战第16天】 本文探讨了Linux操作系统在云计算环境中的应用实践,重点分析了其在稳定性、安全性和高效性方面的优势。通过具体案例,阐述了Linux如何支持虚拟化技术、实现资源高效分配以及与其他开源技术的无缝集成。文章还提供了针对Linux系统在云计算中的优化建议,包括内核参数调整、文件系统选择和性能监控工具的应用,旨在帮助读者更好地理解和应用Linux于云计算场景。 ###
34 3
|
29天前
|
NoSQL Ubuntu Linux
Redis 安装
10月更文挑战第14天
50 1
|
8天前
|
NoSQL 编译器 Linux
【赵渝强老师】Redis的安装与访问
本文基于Redis 6.2版本,详细介绍了在CentOS 7 64位虚拟机环境中部署Redis的步骤。内容包括安装GCC编译器、创建安装目录、解压安装包、编译安装、配置文件修改、启动服务及验证等操作。视频讲解和相关图片帮助理解每一步骤。
|
1月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
233 3
|
1月前
|
存储 JSON API
HTTP 请求与响应处理:C#中的实践
【10月更文挑战第4天】在现代Web开发中,HTTP协议至关重要,无论构建Web应用还是API开发,都需要熟练掌握HTTP请求与响应处理。本文从C#角度出发,介绍HTTP基础知识,包括请求与响应结构,并通过`HttpClient`库演示如何发送GET请求及处理响应,同时分析常见错误并提供解决方案,助你更高效地完成HTTP相关任务。
83 2
|
1月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)