redis自定義lua指令碼

2021-10-05 17:34:52 字數 1979 閱讀 9010

redis底層是用c語言寫的。執行的redis命令底層是呼叫的對應的lua指令碼。下面是跟著james老師通過做自定義lua指令碼,實現限流的功能。

指令碼實現的功能是:在3秒內不超過2個連線。

1、lua編譯器安裝

2、lua指令碼編寫

我是在redis安裝目錄 /usr/local/soft/redis-5.0.5 建立ipcount.lua

local key = keys[1]

local limit = tonumber(ar**[1]

)local expire_time = ar**[2]

local is_exists = redis.call(

"exists",key)

if is_exists == 1 then

if redis.call(

"incr",key)

> limit then

return 0

else

return 1

endelse

redis.call(

"set",key,1)

redis.call(

"expire",key,expire_time)

return 1

end

3、生成指令碼的sha值

src/redis-cli -h 192.168.1.250 -p 6379 -a 123456 script load 「$(cat ipcount.lua)」

[root@hadoop1 redis-5.0.5]

# src/redis-cli -h 192.168.1.250 -p 6379 -a 123456 script load "$(cat ipcount.lua)"

warning: using a password with '-a' or '-u' option on the command line inte***ce may not be safe.

"2cd9c2da1bb6e05e24f1f4e7bfa4a8f7abfbd36b"

4、呼叫lua指令碼

evalsha 2cd9c2da1bb6e05e24f1f4e7bfa4a8f7abfbd36b 1 192.168.1.250 2 3

引數說明:

1—key的數量

192.168.1.250—key值

2—第二個引數值,最大連線數

3—第三個引數值,3秒時間內

[root@hadoop1 redis-5.0.5]

# src/redis-cli -a 123456

warning: using a password with '-a' or '-u' option on the command line inte***ce may not be safe.

127.0.0.1:6379> evalsha 2cd9c2da1bb6e05e24f1f4e7bfa4a8f7abfbd36b 1 192.168.1.250 2 3

(integer) 1

3秒內超過2個連線就返回0,不超過2個連線就返回1,效果如下圖:

5、lua指令碼清除

script kill //殺掉正在執行的lua指令碼

script flush

127.0.0.1:6379> script kill

(error) notbusy no scripts in execution right now.

127.0.0.1:6379> script flush

ok127.0.0.1:6379>

Redis使用Lua指令碼自定義原子操作

1 eval eval 指令碼內容 key個數 key列表 引數列表 127.0.0.1 6379 eval return hello keys 1 ar 1 1 redis why hello redis why 2 evalsha 先通過script load命令將lua指令碼載入到redis,...

lua自定義排序

說一下lua的table庫中比較常用的排序函式 table.sort 第乙個引數代表要進行排序的table,第二個引數是可選的,如果沒有第二個引數,那麼這個函式就會將table元素從小到大進行排序,我主要來說一下第二個引數。第二個引數是函式型別,這個函式接收兩個table元素,如果希望第乙個引數在排...

lua自定義排序函式

說一下lua的table庫中比較常用的排序函式 table.sort 第乙個引數代表要進行排序的table,第二個引數是可選的,如果沒有第二個引數,那麼這個函式就會將table元素從小到大進行排序,我主要來說一下第二個引數。第二個引數是函式型別,這個函式接收兩個table元素,如果希望第乙個引數在排...