1. 程式人生 > 實用技巧 >redis原理2

redis原理2

1:Lua 指令碼

Lua/ˈluə/是一種輕量級指令碼語言,它是用 C 語言編寫的,跟資料的儲存過程有點類似。
使用 Lua 指令碼來執行 Redis 命令的好處:

  1. 一次傳送多個命令,減少網路開銷。
  2. Redis 會將整個指令碼作為一個整體執行,不會被其他請求打斷,保持原子性。
  3. 對於複雜的組合命令,我們可以放在檔案中,可以實現程式之間的命令集複用。

1.1:在 Redis 中呼叫 Lua 指令碼

使用 eval /ɪ'væl/ 方法,語法格式:

redis> eval lua-script key-num [key1 key2 key3 ....] [value1 value2 value3 ....]
  • eval 代表執行 Lua 語言的命令。
  • lua-script 代表 Lua 語言指令碼內容。
  • key-num 表示引數中有多少個 key,需要注意的是 Redis 中 key 是從 1 開始的,如果沒有 key 的引數,那麼寫 0。
  • [key1 key2 key3…]是 key 作為引數傳遞給 Lua 語言,也可以不填,但是需要和 key-num 的個數對應起來。
  • [value1 value2 value3 ….]這些引數傳遞給 Lua 語言,它們是可填可不填的。

示例,返回一個字串,0 個引數:

eval "return 'Hello World'" 0

1.2在 Lua 指令碼中呼叫 Redis 命令

使用 redis.call(command, key [param1, param2…])進行操作。語法格式:

eval "redis.call('set',KEYS[1],ARGV[1])" 1 lua-key lua-value
  • command 是命令,包括 set、get、del
  • key 是被操作的鍵。
  • param1,param2…代表給 key 的引數

注意跟 Java 不一樣,定義只有形參,呼叫只有實參。Lua 是在呼叫時用 key 表示形參,argv 表示引數值(實參)。

1.2.1 設定鍵值對

在 Redis 中呼叫 Lua 指令碼執行 Redis 命令

eval "return redis.call('set',KEYS[1],ARGV[1])" 1 fuyu 9527
get fuyu

以上命令等價於 set fuyu 9527
在 redis-cli 中直接寫 Lua 指令碼不夠方便,也不能實現編輯和複用,通常我們會把指令碼放在檔案裡面,然後執行這個檔案。

1.2.2 在 Redis 中呼叫 Lua 指令碼檔案中的命令,操作 Redis

建立 Lua 指令碼檔案: