、前言
從本章節開始我們就開始講解一些 Redis 的擴展應用了,之前講的主從、哨兵和集群都相當重要,也許小公司用不到集群這么復雜的架構,但是也要了解各知識點的原理,只要了解了原理,無論什么時候是有,就都很容易上手了。本章節講解一下 Redis + LUA 的整合,這里只能當做入門教程,講解一下 Redis + LUA 相關命令,這里不會單獨講解 LUA 的命令,讀者可在菜鳥教程上自行學習,文中會給出教程地址(感謝菜鳥教程整理如此詳細的教程)。
二、LUA 簡介與安裝
1、什么是LUA(摘自百度百科)
Lua 是一個小巧的腳本語言。是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一個研究小組,由 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo 所組成並於1993年開發。 其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。Lua 由標准 C 編寫而成,幾乎在所有操作系統和平台上都可以編譯,運行。Lua 並沒有提供強大的庫,這是由它的定位決定的。所以Lua不適合作為開發獨立應用程序的語言。Lua 有一個同時進行的 JIT 項目,提供在特定平台上的即時編譯功能。
2、Redis 中使用 LUA 的好處
1)減少網絡開銷,在 Lua 腳本中可以把多個命令放在同一個腳本中運行。
2)原子操作,Redis 會將整個腳本作為一個整體執行,中間不會被其他命令插入。換句話說,編寫腳本的過程中無需擔心會出現競態條件。
3)復用性,客戶端發送的腳本會永遠存儲在 Redis 中,這意味着其他客戶端可以復用這一腳本來完成同樣的邏輯。
3、LUA 的安裝
1)下載地址:Lua:下載,下載完成后,上傳到 Linux 服務器
2)安裝
(1)需要先安裝依賴環境:yum -y install readline-devel ncurses-devel
(2)解壓下載好的 LUA 包:tar -zxvf lua-5.3.5.tar.gz
(3)進入到 lua-5.3.5 中,執行 make linux 命令
(4)執行 make install 命令
3)測試:安裝完成后,直接輸入 lua 命令即可進入 lua 的控制台
4、LUA 常見語法
這里不再講 LUA 的語法知識了,內容比較多,可以根據下面的地址自行學習:
三、Redis + LUA 整合使用
從 Redis2.6.0 版本開始,通過內置的 Lua 解釋器,可以使用 EVAL 命令對 LUA 腳本進行求值。(這種形式是不需要單獨安裝 LUA)
1、EVAL 命令
1)命令格式
EVAL script numkeys key [key ...] arg [arg ...]
2)命令說明
(1)script 參數:是一段 Lua 腳本程序,它會被運行在 Redis 服務器上下文中,這段腳本不必(也不應該)定義為一個 Lua 函數。
(2)numkeys 參數:用於指定鍵名參數的個數。
(3)key [key ...] 參數: 從 EVAL 的第三個參數開始算起,使用了 numkeys 個鍵(key),表示在腳本中所用到的那些 Redis 鍵(key),這些鍵名參數可以在 Lua 中通過全局變量 KEYS 數組,用1為基址的形式訪問(KEYS[1],KEYS[2]···)。
(4)arg [arg ...]參數:可以在 Lua 中通過全局變量 ARGV 數組訪問,訪問的形式和 KEYS 變量類似(ARGV[1],ARGV[2]···)。
3)示例
注意:這里使用的命令,是 Redis 提供的,所以是要連接上 Redis 實例的。
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 name1 name2 AlanWorker AlanShelby
2、Lua 腳本中調用 Redis 命令
1)這里我們主要記住 call() 命令即可:
eval "return redis.call('set',KEYS[1],'AlanShelby')" 1 name
3、EVALSHA 命令
1)EVAL 命令要求你在每次執行腳本的時候都發送一次腳本主體(script body)。
2)Redis 有一個內部的緩存機制,因此它不會每次都重新編譯腳本,不過在很多場合,付出無謂的帶寬來傳送腳本主體並不是最佳選擇。
3)為了減少帶寬的消耗, Redis 實現了EVALSHA 命令,它的作用和 EVAL 一樣,都用於對腳本求值,但它接受的第一個參數不是腳本,而是腳本的 SHA1 摘要。
4)EVALSHA 命令的表現如下
(1)如果服務器還記得給定的 SHA1 校驗和所指定的腳本,那么執行這個腳本
(2)如果服務器不記得給定的 SHA1 校驗和所指定的腳本,那么它返回一個特殊的錯誤,提醒用戶使用 EVAL 代替 EVALSHA
5)那么,我們怎么來獲取腳本的 SHA1 摘要呢?下面我們來看一下 SCRIPT 命令:
(1)SCRIPT FLUSH :清除所有腳本緩存。
(2)SCRIPT EXISTS :根據給定的腳本校驗,檢查指定的腳本是否存在於腳本緩存。
(3)SCRIPT LOAD :將一個腳本裝入腳本緩存,返回SHA1摘要,但並不立即運行它。
(4)SCRIPT KILL :殺死當前正在運行的腳本。
這里的 SCRIPT LOAD 命令就可以用來生成腳本的 SHA1 摘要,如下所示:
這里我們獲取了 "return redis.call('set',KEYS[1],ARGV[1])" 這段腳本的 SHA1 摘要,有了摘要,再使用這段腳本就十分簡單了:
4、redis-cli --eval 命令
1)可以使用 redis-cli 命令直接執行腳本,這里我們直接新建一個 lua 腳本文件,用來獲取剛剛存入 Redis 的 name1 的值,vim redis.lua,然后編寫 Lua 命令:
local value = redis.call('get','name1')
return value
編寫完成后,保存退出,執行命令:
./redis-cli -h 192.168.1.216 -p 6379 --eval redis.lua
四、小結
本章節講解了 Redis + LUA 整合使用,有了 LUA,Redis 就猶如進化了一般,能夠實現更多的功能,這個屬於 Redis 的一個擴展知識點,希望讀者看過之后能夠了解什么是 LUA,LUA 的基礎命令以及 Redis 中如何使用 LUA,讀者了解到這些,這篇入門教程的目的就達到了。