Redis中使用Lua脚本(续)- Lua-cjson开源库的安装和使用

  • 问题
  • 原因
  • 解决方案

在Redis的lua脚本编写中,我们可能会用到json的序列化和反序列化。

Json序列化:

-- RedisLuaCjsonEncode.lua文件
local userName = ARGV[1];local userObject = {name = userName,age = 14,address = 'China'}local userJson = cjson.encode(userObject);if redis.call('set', KEYS[1], userJson) == 0
thenreturn -1
elsereturn userJson
end

Json反序列化:

-- RedisLuaCjsonDecode.lua文件
local userInfo = redis.call('get', KEYS[1])local userJson = cjson.decode(userInfo)return userJson.name;

上面这两段代码是笔者写出的两个Json序列化和反序列化的小例子,相信看过前两篇文章的读者都能读懂什么意思。有兴趣的话,可以自行执行以下命令看一下效果:

## 运行RedisLuaCjsonEncode.lua文件,向redis中插入一条序列化成json格式的字符串
[root@vm01 learn_lua]# redis-cli -a 123456 --eval RedisLuaCjsonEncode.lua userInfo , zhangsan## 运行RedisLuaCjsonDecode.lua文件,从redis中一条json格式的字符串,并将其反序列化,并取出其中的name字段的值。
[root@vm01 learn_lua]# redis-cli -a 123456 --eval RedisLuaCjsonDecode.lua userInfo

问题

但如果有兴趣在读者想编写一段和Redis无关的使用 cjson 的纯 Lua 脚本,想要运行,会发现:我跳!运行不了。会报以下错误:

[root@vm01 lua_cjson]# lua cjson_demo.lua
lua: cjson_demo.lua:1: module 'cjson' not found:no field package.preload['cjson']no file './cjson.lua'no file '/usr/share/lua/5.1/cjson.lua'no file '/usr/share/lua/5.1/cjson/init.lua'no file '/usr/lib64/lua/5.1/cjson.lua'no file '/usr/lib64/lua/5.1/cjson/init.lua'no file './cjson.so'no file '/usr/lib64/lua/5.1/cjson.so'no file '/usr/lib64/lua/5.1/loadall.so'
stack traceback:[C]: in function 'require'cjson_demo.lua:1: in main chunk[C]: ?

原因

问题原因: lua-cjson 是一个简单小巧的开源动态库,可被 Lua 脚本 require 加载在 Lua 中通过一系列的 lua-cjson API 调用完成 Lua 值与 Json 值的相互转换(编码及解码)。 即:原生 Lua 并不支持 lua-cjson,需要我们手动将cjson编译到 Lua 环境方可使用。

Redis中使用cjson 的 lua脚本可以直接执行,而不报错。实际是Redis客户端将脚本传输到了Redis服务端,后期 Lua 的脚本都在服务端运行。而Redis服务端,已经在Redis编译安装的过程中,将 cjson开源库以及Lua环境 都已编译进去 不信,您在Redis服务端看:

## 看查询结果的后两行
[root@vm01 lua_cjson]# sudo find / -name lua
/usr/bin/lua
/usr/lib64/lua
/usr/local/lib/lua
/usr/local/share/lua
/usr/local/lua-cjson-2.1.0/lua
/usr/share/lua
/usr/share/locale/lua
/opt/soft/redis/redis-5.0.5/deps/lua
/opt/soft/redis/redis-5.0.5/deps/lua/src/lua

解决方案

那就想办法安装 lua-cjson 呗。在网上找了很多 lua-cjson 的安装方案,发现直接安装,在make编译时总会报错,就是 lua.hlauxlib.h两个文件找不到。

[root@vm01 lua-cjson-2.1.0]# make
cc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include/luajit-2.0/include -fpic -o lua_cjson.o lua_cjson.c
lua_cjson.c:43:17: error: lua.h: No such file or directory
lua_cjson.c:44:21: error: lauxlib.h: No such file or directory

其实是因为 lua-cjson 还要依赖 lua 环境。我们需要安装 LuaJit这么一个Lua代码解析器,后面可以使用luajit命令执行 cjson 的脚本。

安装步骤:

  1. 准备lua-cjson-2.1.0.tar.gz 和 LuaJIT-2.0.5.zip 两个安装包
  2. 安装LuaJIT
## step1. 解压 LuaJIT-2.0.5.zip 到 /usr/local/ 目录
[root@vm11 ~]# unzip LuaJIT-2.0.5.zip -d /usr/local/
[root@vm11 ~]# cd /usr/local/LuaJIT-2.0.5/
[root@vm11 LuaJIT-2.0.5]# pwd
/usr/local/LuaJIT-2.0.5## step2. 在/usr/local/LuaJIT-2.0.5/目录下执行 make && make install 命令
##        看到最后一行成功安装即可
[root@vm11 LuaJIT-2.0.5]# make && make install
==== Building LuaJIT 2.0.5 ====
make -C src
make[1]: Entering directory `/usr/local/LuaJIT-2.0.5/src'
make[1]: Nothing to be done for `default'.
make[1]: Leaving directory `/usr/local/LuaJIT-2.0.5/src'
==== Successfully built LuaJIT 2.0.5 ====
==== Installing LuaJIT 2.0.5 to /usr/local ====
mkdir -p /usr/local/bin /usr/local/lib /usr/local/include/luajit-2.0 /usr/local/share/man/man1 /usr/local/lib/pkgconfig /usr/local/share/luajit-2.0.5/jit /usr/local/share/lua/5.1 /usr/local/lib/lua/5.1
cd src && install -m 0755 luajit /usr/local/bin/luajit-2.0.5
cd src && test -f libluajit.a && install -m 0644 libluajit.a /usr/local/lib/libluajit-5.1.a || :
rm -f /usr/local/bin/luajit /usr/local/lib/libluajit-5.1.so.2.0.5 /usr/local/lib/libluajit-5.1.so /usr/local/lib/libluajit-5.1.so.2
cd src && test -f libluajit.so && \install -m 0755 libluajit.so /usr/local/lib/libluajit-5.1.so.2.0.5 && \ldconfig -n /usr/local/lib && \ln -sf libluajit-5.1.so.2.0.5 /usr/local/lib/libluajit-5.1.so && \ln -sf libluajit-5.1.so.2.0.5 /usr/local/lib/libluajit-5.1.so.2 || :
cd etc && install -m 0644 luajit.1 /usr/local/share/man/man1
cd etc && sed -e "s|^prefix=.*|prefix=/usr/local|" -e "s|^multilib=.*|multilib=lib|" luajit.pc > luajit.pc.tmp && \install -m 0644 luajit.pc.tmp /usr/local/lib/pkgconfig/luajit.pc && \rm -f luajit.pc.tmp
cd src && install -m 0644 lua.h lualib.h lauxlib.h luaconf.h lua.hpp luajit.h /usr/local/include/luajit-2.0
cd src/jit && install -m 0644 bc.lua v.lua dump.lua dis_x86.lua dis_x64.lua dis_arm.lua dis_ppc.lua dis_mips.lua dis_mipsel.lua bcsave.lua vmdef.lua /usr/local/share/luajit-2.0.5/jit
ln -sf luajit-2.0.5 /usr/local/bin/luajit
==== Successfully installed LuaJIT 2.0.5 to /usr/local ====
  1. 安装lua-cjson
  • 步骤1: 解压 lua-cjson-2.1.0.tar.gz 到 /usr/local/ 目录
[root@vm11 ~]# tar -xzf lua-cjson-2.1.0.tar.gz -C /usr/local/
[root@vm11 ~]# cd /usr/local/lua-cjson-2.1.0
[root@vm11 lua-cjson-2.1.0]# pwd
/usr/local/lua-cjson-2.1.0
  • 步骤2:修改 /usr/local/lua-cjson-2.1.0/Makefile 文件

    将 LUA_INCLUDE_DIR = $(PREFIX)/include

    修改为:LUA_INCLUDE_DIR = /usr/local/include/luajit-2.0

  • 步骤3:执行 make && make install 命令,看到如下提示,则证明安装成功

[root@vm11 lua-cjson-2.1.0]# make && make install
cc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include/luajit-2.0 -fpic -o lua_cjson.o lua_cjson.c
cc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include/luajit-2.0 -fpic -o strbuf.o strbuf.c
cc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include/luajit-2.0 -fpic -o fpconv.o fpconv.c
cc  -shared -o cjson.so lua_cjson.o strbuf.o fpconv.o
mkdir -p //usr/local/lib/lua/5.1
cp cjson.so //usr/local/lib/lua/5.1
chmod 755 //usr/local/lib/lua/5.1/cjson.so
  • 步骤4:使用 luajit 命令执行相关lua脚本
[root@vm11 ~]# luajit cjson_demo.lua
true
[1,2,3,4,5,6]
6.66
"I am test1280"
{"addr":"BeiJing","tel":"1569989xxxx","age":24,"name":"Jiang","email":"1569989xxxx@126.com"}

cjson_demo.lua脚本如下:

local cjson = require "cjson"-- 创建实例
local cjson2 = cjson.new()-- 布尔类型
local lua_bool = true
print(cjson2.encode(lua_bool))-- 数组类型
local lua_array = {1, 2, 3, 4, 5, 6}
print(cjson2.encode(lua_array))-- 数值类型
local lua_number = 6.66
print(cjson2.encode(lua_number))-- 字符串类型
local lua_string = "I am test1280"
print(cjson2.encode(lua_string))-- 对象类型
local lua_object = {["name"] = "Jiang",["age"] = 24,["addr"] = "BeiJing",["email"] = "1569989xxxx@126.com",["tel"] = "1569989xxxx"
}
print(cjson2.encode(lua_object))

Redis中使用Lua脚本(续)- Linux下Lua-cjson开源库的安装和使用相关推荐

  1. Redis学习笔记 - Lua脚本(2) - Lua脚本的实现

    参考:<<Redis设计与实现>> 注:这本书是基于Redis3.0版本写的,和后面的版本有点差异 Redis中Lua脚本相关命令介绍以及简单使用,参考博客:https://b ...

  2. Linux shell脚本,Linux下的西红柿时间管理法 I

    Linux shell脚本,Linux下的西红柿时间管理法 I 全部代码在[https://github.com/younggift/tomato.git]. 1. 西红柿时间管理法是什么 西红柿是一 ...

  3. linux动态库路径生效,Linux下如何解决动态库的链接问题

    原标题:Linux下如何解决动态库的链接问题 静态库是一种以空间换取时间和移植性的做法,一些情况下确实有着一定的意义,但是一些情况下,我们自己编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有 ...

  4. linux显卡驱动mxm,linux下我的FX5200显卡驱动安装

    linux下我的FX5200显卡驱动安装 发布时间:2008-09-20 16:42:33来源:红联作者:Keiboc 一.为什么要装驱动 一般情况下,只要你下载了LINUX的最新发行版本,比如Fed ...

  5. Linux下的静态链接库和动态链接库编程

    Linux下的静态链接库和动态链接库编程 参考: Linux下的静态链接库和动态链接库编程 - Histring - 博客园 Mac下静态库和动态库的创建和使用_C/C++_vincent2610的专 ...

  6. linux里c库和gnu c库,Linux下的C的库文件和头文件有什么区别-

    Linux下的C的库文件和头文件有什么区别- (2012-04-10 01:16:57) 标签: linux 杂谈 Linux下的C的库文件和头文件有什么区别?刚刚接触 这里有点没搞清楚 如果按我的理 ...

  7. VMware Linux下拖拽补丁vmtools的安装和卸载

    Linux下拖拽补丁vmtools的安装和卸载 by:授客 QQ:1033553122 Vmware 8.0.4为例子 步骤1.VM->Install Vmware Tools... 步骤2.查 ...

  8. mysql5.6.24安装perl,linux下perl操作MySQL数据库(需要安装DBI)

    这篇文章主要为大家详细介绍了linux下perl操作MySQL数据库(需要安装DBI),具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧!DBI安装:D ...

  9. linux设置软件的路径,linux下查看和设置软件的安装路径

    1:你可以通过whereis 软件名来查找系统里的文件位置 比如你想查找eclipse文件,那么就: [root@localhost ~]# whereis eclipse 会显示: eclipse: ...

最新文章

  1. 本地navicat连接阿里云数据库
  2. 报名开启 | 神策 2019 数据驱动大会「矩·变」等你!
  3. 主存地址位数怎么算_两位数乘一位数也能口算?对!你没看错,不是特殊情况也行...
  4. LeetCode 20. 有效的括号 golang(三)
  5. 【C++ STL学习之六】STL算法之for_each
  6. 算法学习之路|最小生成树——prime算法
  7. 天池实验室-Task04-Python数据分析:从0完成一个数据分析实战
  8. 房地产企业营销分析系统建设中的关键性指标是什么?
  9. 你看那个人他像一条狗
  10. STM32 KEIL 下的 printf 函数
  11. mysql字段里面有16字节特殊字符替换
  12. python程序设计简明教程课后答案_Python简明教程最后的练习题
  13. UnityAction和System.Action引发的思考
  14. caozuoqilai day4
  15. 无心剑汉英双语诗003. 《书海》
  16. 背包型动态规划——零钱兑换
  17. Boss直聘使用技巧 – 求职面试 – 被面技巧
  18. VS Studio和VS Code,IntelliJ IDEA的护眼背景色设置
  19. 695N开发调试总结
  20. 后羿采集器怎么导出数据_免费爬虫工具:后羿采集器如何采集同花顺圈子评论数据...

热门文章

  1. pwlink用作USB转TTL,进入HC-05的AT模式
  2. OPPO Watch新品将于9月16日正式发布
  3. 微软 Visual Studio 2019 正式发布
  4. 自媒体运营转行做数据分析第1年零6个月
  5. 利用python自动在火狐浏览器上输入账号密码
  6. android n 状态栏分析,Android N状态栏图标白底问题
  7. cacheable更新_缓存刷新显示带有@cacheable注释的错误
  8. 使用Eclipse把java文件打包成jar
  9. 「数据结构 | 链表」单链表、双向链表节点操作演示动画
  10. C语言编辑bmi计算器,使用事件处理程序的BMI计算器计算