第四章 Lua模块开发
在實(shí)際開發(fā)中,不可能把所有代碼寫到一個(gè)大而全的lua文件中,需要進(jìn)行分模塊開發(fā);而且模塊化是高性能Lua應(yīng)用的關(guān)鍵。使用require第一次導(dǎo)入模塊后,所有Nginx 進(jìn)程全局共享模塊的數(shù)據(jù)和代碼,每個(gè)Worker進(jìn)程需要時(shí)會(huì)得到此模塊的一個(gè)副本(Copy-On-Write),即模塊可以認(rèn)為是每Worker進(jìn)程共享而不是每Nginx Server共享;另外注意之前我們使用init_by_lua中初始化的全局變量是每請(qǐng)求復(fù)制一個(gè);如果想在多個(gè)Worker進(jìn)程間共享數(shù)據(jù)可以使用ngx.shared.DICT或如Redis之類的存儲(chǔ)。
?
在/usr/example/lualib中已經(jīng)提供了大量第三方開發(fā)庫(kù)如cjson、redis客戶端、mysql客戶端:
cjson.so
resty/
?? aes.lua
?? core.lua
?? dns/
?? lock.lua
?? lrucache/
?? lrucache.lua
?? md5.lua
?? memcached.lua
?? mysql.lua
?? random.lua
?? redis.lua
?? ……
?
?
需要注意在使用前需要將庫(kù)在nginx.conf中導(dǎo)入:
Java代碼??使用方式是在lua中通過如下方式引入
Java代碼??接下來我們來開發(fā)一個(gè)簡(jiǎn)單的lua模塊。
Java代碼??開發(fā)時(shí)將所有數(shù)據(jù)做成局部變量/局部函數(shù);通過 _M導(dǎo)出要暴露的函數(shù),實(shí)現(xiàn)模塊化封裝。
?
接下來創(chuàng)建test_module_1.lua
Java代碼???使用 local var = require("模塊名"),該模塊會(huì)到lua_package_path和lua_package_cpath聲明的的位置查找我們的模塊,對(duì)于多級(jí)目錄的使用require("目錄1.目錄2.模塊名")加載。
?
example.conf配置
Java代碼???
訪問如http://192.168.1.2/lua_module_1進(jìn)行測(cè)試,會(huì)得到類似如下的數(shù)據(jù),count會(huì)遞增
count : 1
count :2
……
count :N
?
此時(shí)可能發(fā)現(xiàn)count一直遞增,假設(shè)我們的worker_processes ?2,我們可以通過kill -9 nginx worker process殺死其中一個(gè)Worker進(jìn)程得到count數(shù)據(jù)變化。
?
?
假設(shè)我們創(chuàng)建了vim /usr/example/lualib/test/module2.lua模塊,可以通過local module2 = require("test.module2")加載模塊
?
基本的模塊開發(fā)就完成了,如果是只讀數(shù)據(jù)可以通過模塊中聲明local變量存儲(chǔ);如果想在每Worker進(jìn)程共享,請(qǐng)考慮競(jìng)爭(zhēng);如果要在多個(gè)Worker進(jìn)程間共享請(qǐng)考慮使用ngx.shared.DICT或如Redis存儲(chǔ)。
來源:http://jinnianshilongnian.iteye.com/blog/2187067
總結(jié)
以上是生活随笔為你收集整理的第四章 Lua模块开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三章 Redis/SSDB+Twemp
- 下一篇: 第五章 常用Lua开发库3-模板渲染