redis在2.6推出了指令碼功能,允許開發者使用lua語言編寫指令碼傳到redis中執行。使用指令碼的好處如下:
在redis客戶端機器上,新建乙個檔案ratelimiting.lua,內容如下:
local times = redis.call('incr
',keys[1
])if times == 1
then
redis.call(
'expire
',keys[1], argv[1
])end
if times > tonumber(argv[2]) then
return
0end
return
1
在redis客戶端機器上,如何測試這個指令碼呢?如下:
redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3
--eval引數是告訴redis-cli讀取並執行後面的lua指令碼,
ratelimiting.lua是指令碼的位置,後面跟著是傳給lua指令碼的引數。
其中","前的rate.limiting:127.0.0.1是要操作的鍵,可以再指令碼中用keys[1]獲取,
","後面的10和3是引數,在指令碼中能夠使用argv[1]和argv[2]獲得。
注:","兩邊的空格不能省略,否則會出錯
結合指令碼的內容可知這行命令的作用是將訪問頻率限制為每10秒最多3次,所以在終端中不斷的執行此命令會發現當訪問頻率在10秒內小於或等於3次時返回1,否則返回0。
測試執行如下:
root@iz23a7607jaz:/home/tinywan/lua# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3
can'
t open file
'ratelimiting.lua'
: no such file or directory
root@iz23a7607jaz:/home/tinywan/lua# redis-cli --
eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 1
root@iz23a7607jaz:/home/tinywan/lua# redis-cli --
eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 1
root@iz23a7607jaz:/home/tinywan/lua# redis-cli --
eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 1
root@iz23a7607jaz:/home/tinywan/lua# redis-cli --
eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 1
root@iz23a7607jaz:/home/tinywan/lua# redis-cli --
eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 0
root@iz23a7607jaz:/home/tinywan/lua# redis-cli --
eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 0
root@iz23a7607jaz:/home/tinywan/lua# redis-cli --
eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 0
root@iz23a7607jaz:/home/tinywan/lua# redis-cli --
eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
補充:
c 中用lua指令碼執行redis命令
直接貼出 實現執行lua指令碼的方法,用到的第三方類庫是 stackexchange.redis nuget上有 注 下面的 是簡化後的,實際使用要修改,using system using system.collections.generic using system.linq using sys...
redis指令碼使用Lua直譯器執行
redis在2.6之前,指令碼使用lua直譯器來執行指令碼,2.6之後內嵌了lua環境,執行指令碼命令使用eval.evla命令語法 eval script numkeys key key arg arg eval return 2 key1 key2 first second 1 key1 2 k...
c 中用lua指令碼執行redis命令
直接貼出 實現執行lua指令碼的方法,用到的第三方類庫是 stackexchange.redis nuget上有 注 下面的 是簡化後的,實際使用要修改,csharp view plain copy using system using system.collections.generic usin...