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元素,如果希望第乙個引數在排...