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ù)類型和Redis返回值類型對(duì)應(yīng)

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

(2)字符串——字符串

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

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

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

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

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

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

注意:

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

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

但是這種寫法,就無(wú)法兼容集群,也就是說不能在集群中使用。要兼容集群,建議

的方式是在客戶端獲取所有的key,然后通過KEYS傳到腳本中。

5:evalsha命令:可以通過腳本摘要來運(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ì)在這類命令執(zhí)行后,把該腳本標(biāo)記為lua_random_dirty,此后只允許調(diào)用讀命令,不許修改,否則返回錯(cuò)誤,這類Redis命令有:spop、srandmember、randomkey、time。

MetaTable

用來實(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ū)ο箢愃朴贘avaScript的面向?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è)子類來繼承user:

local child={address='bj'}

setmetatable(child,{__index=user})

__index在這里起的作用就類似于JS中的Prototype

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

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

function child:show(a)

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

end

模塊化

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

1:可以直接使用require(“model_name”)來載入別的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)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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