【虹科乾貨】觸發器和函式:讓程式碼更接近資料

虹科雲科技發表於2023-12-14

文章速覽:

l 觸發器和函式的基礎知識

l 編寫語言:從 Lua JavaScript

l 輕鬆維護應用程式程式碼

l 資料庫事件實時處理

l 如何操作觸發器和函式

 


一般來說,應用程式處理業務 邏輯, 將執行程式碼傳送到資料庫。 因此 每次執行函式時 程式碼都會從客戶端流入伺服器 ,結果就是這個過程十分緩慢,甚至會出現程式碼在應用程式之間重複執行的情況。

 

我們 一向是 反對複雜性 的!

Redis Gears 四年前 推出的 RedisGears,是 Redis 平臺內的第一個可程式設計模型 開發人員 在資料所在的地方編寫並執行指令碼。

Redis 7.0 Redis 7.0引入了帶有函式的指令碼方法,函式作為資料庫的一部分,提高了可用性和永續性,繼承了資料的複製和永續性級別。

Redis 7.2 Redis 7.2 更進一步 ,引入了觸發器和函式 ,以 增強Redis的可程式設計性 擴充套件了伺服器端功能 改進了資料庫中執行功能的方式和時間 促進 了直接在資料所在的地方執行復雜的業務邏輯。

 

一、 觸發器和函式的基礎知識

觸發器和函式是透過Redis Stack提供的新一代可程式設計 功能 。它允許開發人員直接在Redis資料庫中針對資料更改進行程式設計、儲存和自動執行JavaScript程式碼。

1 開發人員 可以 定義事件(稱為觸發器)來執行更接近資料的函式。也就是說,開發人員定義響應資料庫事件或命令而執行的業務邏輯。這加快了程式碼和相關互動的速度,因為無需等待即可將程式碼從客戶端引入資料庫。 

2 加快對Redis中其他事件的反應時間 如鍵空間通知,這些通知無法透過釋出和訂閱( Pub/Sub )事件等其他方式實時處理。

3 、遠端功能: 觸發器和函式處理叢集資料庫內的分佈,在每個分片上安裝庫並根據金鑰所在的位置執行函式。遠端函式允許執行讀取操作,這些操作可以從任何槽訪問資料,甚至在叢集資料庫中也是如此,因此可以從每個函式訪問所有資料。

二、編寫語言:從 Lua JavaScript

Redis使用Lua來編寫指令碼和函式。Lua有很多好處,例如程式碼可重用性,但它並不是專業開發人員常用的語言。根據2022 年StackOverflow開發者調查, 只有   3.2% 的開發人員在專業領域使用   Lua

因此,在 Redis7.2 中引入了 JavaScript ,這種更流行 的語言 的引入, 可以降低新Redis開發人員的 採用成本

三、 輕鬆維護 應用程式程式碼

觸發器和函式的另一個好處是它 降低了跨多個應用程式管理業務邏輯的複雜性  

當多個應用程式訪問同一資料庫時,開發人員必須協調應用程式如何以一致的方式處理資料。在每個應用程式中複製程式碼以驗證資料、豐富搜尋結果 ,或 在另一個應用程式進行更改時更新資料庫 是很常見的。

有了 觸發器和函式, 不再需要在多個應用程式上重複程式碼 。程式碼始終以相同的方式執行,按需執行或由資料庫中的事件啟動。

四、 資料庫事件實時處理

到目前為止, 開發人員 Redis中的資料庫事件做出反應需要依賴Pub/Sub機制。雖然 Pub/Sub有很多優點,但它並不總是正確的選擇。特別是,Pub/Sub不是實時的。客戶端必須主動監聽事件;如果客戶端沒有監聽,事件就會丟失。

Redis7.2 時代 開發人員可以註冊基於鍵字首和事件型別執行的鍵空間觸發器 。觸發器可以以原子方式執行, 因此 在事件和業務邏輯之間不處理其他Redis事件。

五、如何操作觸發器和函式

這裡,我們介紹 如何 註冊一個函式和一個觸發器。當透過TFCALL命令呼叫函式時,函式就會被執行;觸發器根據Redis中的事件執行。

1. 序言定義我們使用js引擎,庫名稱為lib,所需的觸發器和函式API的最低版本為1.0。

#!js name=lib api_version=1.0

2. 接下來,我們建立一個返回Redis命令結果的函式。客戶端允許在我們的函式中執行Redis 命令。資料事件包含執行函式時可以提供的鍵和引數。

function answer(client, data) {

    return client.call(“ping”);

}

3. Redis全域性變數允許 我們 註冊觸發器和函式,並記錄到日誌檔案 。我們 該函式 註冊一個名稱 ,並在函式執行時呼叫

redis.registerFunction(‘playPingPong’, answer);

4. 完整的JavaScript檔案如下所示 將其另存為lib.js. 

#!js name=lib api_version=1.0

 

function answer(client, data) {

    return client.call(‘ping’);

}

 

redis.registerFunction(‘playPingPong’, answer);

5. 然後我們使用命令在觸發器和函式中註冊我們的函式TFUNCTION LOAD。該TFUNCTION LOAD命令 還可以在叢集資料庫中分發函式庫。

> redis-cli  -x TFUNCTION LOAD < ./lib.js

OK

6. 現在我們可以使用TFCALL命令執行該函式。該命令獲取以句點分隔的庫名稱和函式名稱。

>redis-cli TFCALL lib.playPingPong 0

“PONG”

7. 這樣,就成功地在Redis資料庫中建立、註冊並觸發了一個函式。

8. 我們可以使用鍵空間觸發器 擴充 這個示例。我們新增了一個新的註冊,該註冊對字首為'fellowship:'的鍵做出反應。在lib.js檔案末尾新增此程式碼。

function addLastUpdatedField(client, data) {

    if(data.event == ‘hset’) {

    var currentDateTime = Date.now();

    client.call(‘hset’, data.key, ‘last_updated’, currentDateTime.toString());

}

}

 

redis.registerKeySpaceTrigger(‘addLastUpdated’, 'fellowship:', addLastUpdatedField);

9.   使用帶有   REPLACE 引數的   TFUNCTION LOAD 命令來更新現有庫。 該TFUNCTION LOAD REPLACE 命令立即更新所有使用 Redis 資料庫的客戶端,並且它們 開始使用新的業務邏輯。

>redis-cli -x TFUNCTION LOAD REPLACE . < ./lib.js

OK

10. 要測試新的鍵空間觸發器,請建立一個以Fellowship:開頭的新鍵,並使用RedisInsight 檢查欄位。 鍵空間 觸發器是透過命令執行的,因此在建立 時已經新增了last_updated欄位。 最後,我們可以在 RedisInsight中檢視結果。

 

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70026953/viewspace-3000116/,如需轉載,請註明出處,否則將追究法律責任。

相關文章