使用lua-cmsgpack序列化和反序列化lua對(duì)象

lua-cmsgpack是一個(gè)開源的MessagePack實(shí)現(xiàn)方式久信、純C的庫豁翎,沒有任何其它依賴罪塔,編譯后可以直接被lua調(diào)用投蝉,目前主要支持Lua 5.1/5.2/5.3 版本。
1征堪、什么是MessagePack瘩缆?


官方的解釋是:

It's like JSON.
but fast and small.

跟JSON及其類似,但是比JSON更快并且占用空間更小佃蚜,舉個(gè)官方給出的例子庸娱,直接截官方圖:

官方圖.png

翻譯官方的解釋:
MessagePack是一種高效的二進(jìn)制序列化格式, 它允許在多種語言(如JSON)之間交換數(shù)據(jù)谐算,但它越來越小熟尉, 小整數(shù)被編碼為單個(gè)字節(jié),典型的短字符串除了字符串本身之外還需要一個(gè)額外的字節(jié)洲脂。

目前市面上流行的開發(fā)語言MessagePack幾乎支持斤儿,官方的地址為:http://msgpack.org/Lua MessagePack也提供了一套開源庫,地址在:https://github.com/fperrad/lua-MessagePack/恐锦。

但是往果,作者使用的是lua-cmsgpack,至于哪個(gè)比較優(yōu)異一铅,作者還沒有去比較陕贮,主要是先發(fā)現(xiàn)了lua-cmsgpack,后面看了下README文件馅闽,使用方法應(yīng)該是差不多的飘蚯,大家可以拿來參考。

2福也、編譯lua-cmsgpack

lua-cmsgpack包括官方提供的lua-MessagePack都需要自行編譯局骤,因?yàn)榭赡芷脚_(tái)太多,所以官方?jīng)]有為每一個(gè)平臺(tái)提供編譯好的版本暴凑。lua-cmsgpack的github地址為:https://github.com/antirez/lua-cmsgpack
git clone下來之后需要安裝cmake工具峦甩,mac平臺(tái)直接在項(xiàng)目目錄:

cmake .
make

即可,當(dāng)然需要預(yù)先安裝lua,并且是5.1版本以上的凯傲。

主要說下CentOS平臺(tái)下cmake可能會(huì)出現(xiàn)的問題犬辰,如果cmake的過程出現(xiàn)以下錯(cuò)誤:

Could NOT find Lua51 (missing:  LUA_INCLUDE_DIR) 
...
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
CMake 2.8 or higher is required.  You are running version 2.6.4
Configuring incomplete, errors occurred!

出現(xiàn)以上錯(cuò)誤的話,需要自行安裝lua的一些依賴庫冰单,一般:

yum -y install lua lua-devel

就可以了幌缝,如果還不行,再試試下面的命令:

yum install ncurses-devel gcc gcc-c++ make

編譯完成之后會(huì)生成cmsgpack.so文件诫欠,使用的時(shí)候直接require進(jìn)去即可

3涵卵、lua調(diào)用例子

   1 local cmsgpack = require "cmsgpack"
   2
   3 local tba = {1, 2, 3}
   4
   5 local tbb = {
   6     a = 1,
   7     b = 3
   8 }
   9
  10 local msgpack = cmsgpack.pack(tba, tbb)
  11
  12 local res1, res2 = cmsgpack.unpack(msgpack)
  13
  14 for k, v in pairs(res1) do
  15     print(k, v)
  16 end
  17
  18 for i, v in pairs(res2) do
  19     print(i, v)
  20 end

運(yùn)行效果:

#lua test_table.lua
1       1
2       2
3       3
a       1
b       3

cmsgpack.pack()可以把多個(gè)lua對(duì)象序列化成一個(gè)二進(jìn)制msgpack,執(zhí)行反序化的時(shí)候會(huì)返回對(duì)應(yīng)數(shù)量的lua對(duì)象荒叼,非常的方便轿偎。

4、結(jié)合redis存儲(chǔ)序列化后的msgpack

有趣的是redis也支持MessagePack被廓,因此結(jié)合lua和lua-cmsgpack可以產(chǎn)生不錯(cuò)的化學(xué)反應(yīng)坏晦,下面是一個(gè)簡(jiǎn)單的例子(結(jié)合OpenResty):

local cmsgpack  = require "cmsgpack"
local redis     = require "resty.redis"
local red       = redis:new()

local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
   ngx.say("failed to connect: ", err)
   return
  end

local lua_table = {
     a = 1,
     b = 3
}
local msgpack = cmsgpack.pack(lua_table)
local ok, err = red:set("msg",  msgpack)
if not ok then
   ngx.say("failed to set dog: ", err)
   return
end

local ret_pack  = red:get("msg")
local ret_table = cmsgpack.unpack(ret_pack)

ngx.say(ret_table.a + ret_table.b)

測(cè)試返回結(jié)果:

4

在某些場(chǎng)合還是有不錯(cuò)應(yīng)用場(chǎng)景的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫁乘,一起剝皮案震驚了整個(gè)濱河市昆婿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亦渗,老刑警劉巖挖诸,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異法精,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痴突,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門搂蜓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辽装,你說我怎么就攤上這事帮碰。” “怎么了拾积?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵殉挽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我拓巧,道長(zhǎng)斯碌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任肛度,我火速辦了婚禮傻唾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘承耿。我一直安慰自己冠骄,他們只是感情好伪煤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凛辣,像睡著了一般抱既。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扁誓,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天蝙砌,我揣著相機(jī)與錄音,去河邊找鬼跋理。 笑死择克,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的前普。 我是一名探鬼主播肚邢,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拭卿!你這毒婦竟也來了骡湖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤峻厚,失蹤者是張志新(化名)和其女友劉穎响蕴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惠桃,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浦夷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辜王。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劈狐。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呐馆,靈堂內(nèi)的尸體忽然破棺而出肥缔,到底是詐尸還是另有隱情,我是刑警寧澤汹来,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布续膳,位于F島的核電站,受9級(jí)特大地震影響收班,放射性物質(zhì)發(fā)生泄漏坟岔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一闺阱、第九天 我趴在偏房一處隱蔽的房頂上張望炮车。 院中可真熱鬧,春花似錦、人聲如沸瘦穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扛或。三九已至绵咱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熙兔,已是汗流浹背悲伶。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留住涉,地道東北人麸锉。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舆声,于是被迫代替她去往敵國和親花沉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理媳握,服務(wù)發(fā)現(xiàn)碱屁,斷路器,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,290評(píng)論 7 249
  • openresty OpenResty是一個(gè)基于 Nginx 與 Lua 的高性能 Web 平臺(tái)柿赊,其內(nèi)部集成了大量...
    吃瓜的東閱讀 5,974評(píng)論 0 7
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件隘冲、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • 室友說話把我吵醒時(shí)展辞,我已經(jīng)睡了兩個(gè)小時(shí),這兩個(gè)小時(shí)中手機(jī)鬧鐘被我無意識(shí)的關(guān)掉了万牺,然后我陷入了兩個(gè)小時(shí)的夢(mèng)境罗珍,一個(gè)夢(mèng)...
    武小五呀閱讀 321評(píng)論 2 3