9.lua腳本與redis結(jié)合

Redis和Lua結(jié)合

1:redis.call:在腳本中調(diào)用Redis命令蚯嫌,遇到錯(cuò)誤會(huì)直接返回

2:redis.pcall:在腳本中調(diào)用Redis命令,遇到錯(cuò)誤會(huì)記錄錯(cuò)誤并繼續(xù)執(zhí)行

3:Lua數(shù)據(jù)類(lèi)型和Redis返回值類(lèi)型對(duì)應(yīng)

(1)數(shù)字——整數(shù)

(2)字符串——字符串

(3)表類(lèi)型——多行字符串

(4)表類(lèi)型(只有一個(gè)ok字段存儲(chǔ)狀態(tài)信息)——狀態(tài)回復(fù)

(5)表類(lèi)型(只有一個(gè)err字段存儲(chǔ)錯(cuò)誤信息)——錯(cuò)誤回復(fù)

4:eval命令:在Redis中執(zhí)行腳本

(1)格式是:eval 腳本內(nèi)容 key參數(shù)數(shù)量 [key…] [arg…]

(2)通過(guò)key和arg兩類(lèi)參數(shù)來(lái)向腳本傳遞數(shù)據(jù),在腳本中分別用KEYS和ARGV來(lái)獲取

注意:

對(duì)于KEYS和ARGV的使用并不是強(qiáng)制的晾浴,也可以不從KEYS去獲取鍵,而是在腳本中硬

編碼政己,比如:redis.call(‘get’,’user:’..ARGV[1]) 0 key1 愧薛,照樣能取到”user:key1”對(duì)應(yīng)的值晨炕。

但是這種寫(xiě)法,就無(wú)法兼容集群厚满,也就是說(shuō)不能在集群中使用府瞄。要兼容集群,建議

的方式是在客戶端獲取所有的key碘箍,然后通過(guò)KEYS傳到腳本中遵馆。

5:evalsha命令:可以通過(guò)腳本摘要來(lái)運(yùn)行,其他同eval丰榴。執(zhí)行的時(shí)候會(huì)根據(jù)摘要去找緩存的

腳本货邓,找到了就執(zhí)行,否則會(huì)返回錯(cuò)誤四濒。

6:script load:將腳本加入緩存换况,返回值就是SHA1摘要

7:script exists:判斷腳本是否已經(jīng)緩存

8:script flush:清空腳本緩存

9:script kill:強(qiáng)制終止腳本的執(zhí)行,如果腳本中修改了某些數(shù)據(jù)盗蟆,那么不會(huì)終止腳本的執(zhí)行戈二,以保證腳本執(zhí)行的原子性
沙箱

為了保證Redis服務(wù)器的安全,并且要確保腳本的執(zhí)行結(jié)果只和腳本執(zhí)行時(shí)傳遞的參數(shù)有關(guān)喳资,Redis禁止腳本中使用操作文件或系統(tǒng)調(diào)用相關(guān)的函數(shù)觉吭,腳本中只能對(duì)Redis數(shù)據(jù)進(jìn)行操作,這就是沙箱仆邓。

Redis會(huì)禁用腳本的全局變量鲜滩,以保證腳本之間是隔離的,互不相干的节值。

Redis對(duì)隨機(jī)數(shù)和隨機(jī)結(jié)果的處理

1:為了確保執(zhí)行結(jié)果可以重現(xiàn)徙硅,Redis對(duì)隨機(jī)數(shù)的功能進(jìn)行了處理,以保證每次執(zhí)行腳本生成的隨機(jī)數(shù)列都相同

2:Redis還對(duì)產(chǎn)生隨機(jī)結(jié)果進(jìn)行了處理搞疗,比如smembers或hkeys等嗓蘑,數(shù)據(jù)都是無(wú)序的,Redis會(huì)對(duì)結(jié)果按照字典進(jìn)行順序排序

3:對(duì)于會(huì)產(chǎn)生隨機(jī)結(jié)果但無(wú)法排序的命令匿乃,比如指揮產(chǎn)生一個(gè)元素脐往,Redis會(huì)在這類(lèi)命令執(zhí)行后,把該腳本標(biāo)記為lua_random_dirty扳埂,此后只允許調(diào)用讀命令,不許修改瘤礁,否則返回錯(cuò)誤阳懂,這類(lèi)Redis命令有:spop、srandmember、randomkey岩调、time巷燥。

MetaTable

用來(lái)實(shí)現(xiàn)重載操作符功能,基本示例如下:

1:自定義操作的函數(shù)号枕,示例:

myAdd={}

function myAdd.__add(f1,f2)

--具體的操作

end

2:為已有的table設(shè)置自定義的操作模板缰揪,示例:

setmetatable(tableA,myAdd)

setmetatable(tableB,myAdd)

3:對(duì)兩個(gè)table做加的操作,示例:

tableA+tableB 這個(gè)時(shí)候就會(huì)調(diào)用自定義的myAdd了葱淳,等于重載了默認(rèn)的_add方法钝腺,myAdd的__add方法就是MetaMethod

4:Lua內(nèi)建約定的MetaMethod :

__add(a, b) 、__sub(a, b)赞厕、__mul(a, b)艳狐、__div(a, b)、__mod(a, b)皿桑、__pow(a, b) 毫目、

__unm(a) 取反、__concat(a, b)诲侮、__len(a)镀虐、__eq(a, b)、__lt(a, b)沟绪、__le(a, b)刮便、__index(a, b)

對(duì)應(yīng)表達(dá)式 a.b、__newindex(a, b, c) 對(duì)應(yīng)表達(dá)式 a.b = c近零、__call(a, ...)

面向?qū)ο?/p>

Lua腳本的面向?qū)ο箢?lèi)似于JavaScript的面向?qū)ο笈岛耍际悄M的,比如:

1:直接創(chuàng)建對(duì)象:local user={userId='user1',userName='sishuok'}

2:添加新屬性:user.age = 12

3:添加方法

function user:show(a)

redis.log(redis.LOG_NOTICE,'a='..a..',age='..self['age'])

end

里面的self就相當(dāng)于this

4:就可以調(diào)用方法了:user:show('abc')

5:做個(gè)子類(lèi)來(lái)繼承user:

local child={address='bj'}

setmetatable(child,{__index=user})

__index在這里起的作用就類(lèi)似于JS中的Prototype

6:繼承了自然就可以調(diào)用父類(lèi)的屬性和方法了:child:show('child')

7:當(dāng)然你還可以定義自己的方法去覆蓋父類(lèi)的方法:

function child:show(a)

redis.log(redis.LOG_NOTICE,'child='..a..',age='..self['age']..',address=='..self.address)

end

模塊化

注意:這種方式不能在Redis中使用久信,目前不支持

1:可以直接使用require(“model_name”)來(lái)載入別的lua文件窖杀,文件的后綴是.lua。載入的時(shí)候就會(huì)直接執(zhí)行那個(gè)文件

2:載入同樣的lua文件時(shí)裙士,只有第一次的時(shí)候會(huì)去執(zhí)行入客,后面的相同的都不執(zhí)行了

3:如果要讓每一次文件都執(zhí)行,可使用dofile(“model_name”)函數(shù)

4:如果要載入后不執(zhí)行腿椎,等需要的時(shí)候執(zhí)行桌硫,可使用 loadfile(“model_name”)函數(shù),這種是把loadfile的結(jié)果賦值給一個(gè)變量啃炸,比如:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铆隘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子南用,更是在濱河造成了極大的恐慌膀钠,老刑警劉巖掏湾,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肿嘲,居然都是意外死亡融击,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)雳窟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尊浪,“玉大人,你說(shuō)我怎么就攤上這事封救∧吹樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵兴泥,是天一觀的道長(zhǎng)工育。 經(jīng)常有香客問(wèn)我,道長(zhǎng)搓彻,這世上最難降的妖魔是什么如绸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮旭贬,結(jié)果婚禮上怔接,老公的妹妹穿的比我還像新娘。我一直安慰自己稀轨,他們只是感情好扼脐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著奋刽,像睡著了一般瓦侮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佣谐,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天肚吏,我揣著相機(jī)與錄音,去河邊找鬼狭魂。 笑死罚攀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雌澄。 我是一名探鬼主播斋泄,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镐牺!你這毒婦竟也來(lái)了炫掐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤睬涧,失蹤者是張志新(化名)和其女友劉穎募胃,沒(méi)想到半個(gè)月后沛厨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摔认,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宅粥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片参袱。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秽梅,靈堂內(nèi)的尸體忽然破棺而出抹蚀,到底是詐尸還是另有隱情,我是刑警寧澤企垦,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布环壤,位于F島的核電站,受9級(jí)特大地震影響钞诡,放射性物質(zhì)發(fā)生泄漏郑现。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一荧降、第九天 我趴在偏房一處隱蔽的房頂上張望接箫。 院中可真熱鬧,春花似錦朵诫、人聲如沸辛友。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)废累。三九已至,卻和暖如春脱盲,著一層夾襖步出監(jiān)牢的瞬間邑滨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工宾毒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驼修,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓诈铛,卻偏偏與公主長(zhǎng)得像乙各,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幢竹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • Lua介紹 Lua是一個(gè)高效耳峦、簡(jiǎn)潔、輕量級(jí)焕毫、可擴(kuò)展的腳本語(yǔ)言蹲坷,可以很方便的嵌入到其它語(yǔ)言中使 用驶乾,Redi...
    我是黑炭閱讀 1,856評(píng)論 0 1
  • NOSQL類(lèi)型簡(jiǎn)介鍵值對(duì):會(huì)使用到一個(gè)哈希表,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)循签,如redis级乐,volde...
    MicoCube閱讀 3,958評(píng)論 2 27
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)风科、高可擴(kuò)展、高可用乞旦、大數(shù)據(jù)存儲(chǔ)問(wèn)題而產(chǎn)生的數(shù)據(jù)庫(kù)解決方...
    克魯?shù)吕?/span>閱讀 5,268評(píng)論 0 36
  • 小強(qiáng)軟件測(cè)試贼穆,因?yàn)椴皇翘焐愘|(zhì),所以必須天生勵(lì)志兰粉。性能故痊、python自動(dòng)化班長(zhǎng)期招生,咨詢QQ:208350323...
    測(cè)試幫日記閱讀 676評(píng)論 0 2
  • react項(xiàng)目中引入ant design的組件,配置項(xiàng)內(nèi)容很多玖姑,功能也非常強(qiáng)大愕秫。 前三個(gè)基本項(xiàng)不做過(guò)多的說(shuō)明,ti...
    danihay閱讀 20,156評(píng)論 1 1