• 正文
    • 一、觸發(fā)器和函數的基礎知識
    • 二、編寫語言:從Lua到JavaScript
    • 三、輕松維護應用程序代碼
    • 四、數據庫事件實時處理
    • 五、如何操作觸發(fā)器和函數
  • 推薦器件
  • 相關推薦
申請入駐 產業(yè)圖譜

虹科干貨 | 觸發(fā)器和函數:讓代碼更接近數據

2023/12/20
2557
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

簡介: Redis是一個強大的數據庫平臺,可以用于構建和維護實時應用程序。開發(fā)人員可以通過創(chuàng)建JavaScript函數,在Redis數據庫中自動執(zhí)行數據更改代碼,從而確保較低的延遲。Redis的可編程性為應用程序開發(fā)提供了更靈活和高效的解決方案。

文章速覽:

  • 觸發(fā)器和函數的基礎知識
  • 編寫語言:從Lua到JavaScript
  • 輕松維護應用程序代碼
  • 數據庫事件實時處理
  • 如何操作觸發(fā)器和函數

引導語:

一般來說,應用程序處理業(yè)務的邏輯,是將執(zhí)行代碼發(fā)送到數據庫。因此每次執(zhí)行函數時,代碼都會從客戶端流入服務器,結果就是這個過程十分緩慢,甚至會出現代碼在應用程序之間重復執(zhí)行的情況。

而我們一向是反對復雜性的!從Redis Gears到Redis7.0再到Redis7.2,一直在為開發(fā)人員提供更靈活、高效的解決方案。

Redis Gears:四年前推出的RedisGears,是Redis平臺內的第一個可編程模型,開發(fā)人員能在數據所在的地方編寫并執(zhí)行腳本。

Redis 7.0:Redis 7.0引入了帶有函數的腳本方法,函數作為數據庫的一部分,提高了可用性和持久性,繼承了數據的復制和持久性級別。

Redis 7.2:Redis 7.2更進一步,引入了觸發(fā)器和函數,以增強Redis的可編程性;擴展了服務器端功能;改進了數據庫中執(zhí)行功能的方式和時間;并促進了直接在數據所在的地方執(zhí)行復雜的業(yè)務邏輯。

一、觸發(fā)器和函數的基礎知識

觸發(fā)器和函數是通過Redis Stack提供的新一代可編程功能。它允許開發(fā)人員直接在Redis數據庫中針對數據更改進行編程、存儲和自動執(zhí)行JavaScript代碼。

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

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

3、遠程功能:觸發(fā)器和函數處理集群數據庫內的分布,在每個分片上安裝庫并根據密鑰所在的位置執(zhí)行函數。遠程函數允許執(zhí)行讀取操作,這些操作可以從任何槽訪問數據,甚至在集群數據庫中也是如此,因此可以從每個函數訪問所有數據。

二、編寫語言:從Lua到JavaScript

Redis使用Lua來編寫腳本和函數。Lua有很多好處,例如代碼可重用性,但它并不是專業(yè)開發(fā)人員常用的語言。根據2022 年StackOverflow開發(fā)者調查,只有 3.2% 的開發(fā)人員在專業(yè)領域使用 Lua。
因此,在Redis7.2中引入了JavaScript,這種更流行的語言的引入,可以降低新Redis開發(fā)人員的采用成本。

三、輕松維護應用程序代碼

觸發(fā)器和函數的另一個好處是它降低了跨多個應用程序管理業(yè)務邏輯的復雜性。

當多個應用程序訪問同一數據庫時,開發(fā)人員必須協調應用程序如何以一致的方式處理數據。在每個應用程序中復制代碼以驗證數據、豐富搜索結果,或在另一個應用程序進行更改時更新數據庫也是很常見的。
有了觸發(fā)器和函數,就不再需要在多個應用程序上重復代碼。代碼始終以相同的方式執(zhí)行,按需執(zhí)行或由數據庫中的事件啟動。

四、數據庫事件實時處理

到目前為止,開發(fā)人員對Redis中的數據庫事件做出反應需要依賴Pub/Sub機制。雖然 Pub/Sub有很多優(yōu)點,但它并不總是正確的選擇。特別是,Pub/Sub不是實時的??蛻舳吮仨氈鲃颖O(jiān)聽事件;如果客戶端沒有監(jiān)聽,事件就會丟失。

在Redis7.2時代,開發(fā)人員可以注冊基于鍵前綴和事件類型執(zhí)行的鍵空間觸發(fā)器。觸發(fā)器可以以原子方式執(zhí)行,因此在事件和業(yè)務邏輯之間不處理其他Redis事件。

五、如何操作觸發(fā)器和函數

這里,我們介紹如何注冊一個函數和一個觸發(fā)器。當通過TFCALL命令調用函數時,函數就會被執(zhí)行;觸發(fā)器根據Redis中的事件執(zhí)行。

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

#!js name=lib api_version=1.0

2.接下來,我們創(chuàng)建一個返回Redis命令結果的函數??蛻舳嗽试S在我們的函數中執(zhí)行Redis 命令。數據事件包含運行函數時可以提供的鍵和參數。

function answer(client, data) {
return client.call(“ping”);
}

3.Redis全局變量允許我們注冊觸發(fā)器和函數,并記錄到日志文件中。我們?yōu)樵摵瘮底砸粋€名稱,并在函數執(zhí)行時調用它。

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.然后我們使用命令在觸發(fā)器和函數中注冊我們的函數TFUNCTION LOAD。該TFUNCTION LOAD命令還可以在集群數據庫中分發(fā)函數庫。

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

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

>redis-cli TFCALL lib.playPingPong 0
PONG”

7.這樣,就成功地在Redis數據庫中創(chuàng)建、注冊并觸發(fā)了一個函數。

8.我們可以使用鍵空間觸發(fā)器拓展這個示例。我們添加了一個新的注冊,該注冊對前綴為'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 數據庫的客戶端,并且它們會開始使用新的業(yè)務邏輯。

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

10.要測試新的鍵空間觸發(fā)器,請創(chuàng)建一個以Fellowship:開頭的新鍵,并使用RedisInsight 檢查字段。鍵空間觸發(fā)器是通過命令執(zhí)行的,因此在創(chuàng)建鍵時已經添加了last_updated字段。最后,我們可以在RedisInsight中查看結果。

了解虹科Redis企業(yè)版產品更多信息,歡迎前往【艾特保】官方網站 :https://haocst.com/

聯系虹科工程師:TEL:15528663362

推薦器件

更多器件
器件型號 數量 器件廠商 器件描述 數據手冊 ECAD模型 風險等級 參考價格 更多信息
CY62167DV30LL-55BVXIT 1 Cypress Semiconductor Standard SRAM, 1MX16, 55ns, CMOS, PBGA48, 8 X 9.50 MM, 1 MM HEIGHT, LEAD FREE, VFBGA-48
暫無數據 查看
TCMT1600 1 Telefunken Semiconductor GmbH & Co Kg Transistor Output Optocoupler, 1-Element, 3750V Isolation,
$0.72 查看
74HC14D,653 1 Nexperia 74HC14; 74HCT14 - Hex inverting Schmitt trigger@en-us SOIC 14-Pin

ECAD模型

下載ECAD模型
$0.25 查看

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

虹科是一家資源整合及技術服務落地供應商,與全球頂尖公司深度技術合作,專注于制造業(yè)、汽車、生物、醫(yī)藥、測試與測量、廣播電視與媒體、通信、網絡安全、光電等領域,為客戶提供:智能自動化、工業(yè)物聯網、智能感知、數字化+AR、光電、網絡安全、測試測量、衛(wèi)星與無線通信、醫(yī)藥環(huán)境監(jiān)測與驗證、生命科學、汽車電子、汽車維修診斷、云科技等解決方案。虹科始終致力于為行業(yè)客戶提供創(chuàng)新及前端的產品和技術解決方案,為科技社會發(fā)展助力加碼。