加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、觸發(fā)器和函數(shù)的基礎(chǔ)知識(shí)
    • 二、編寫(xiě)語(yǔ)言:從Lua到JavaScript
    • 三、輕松維護(hù)應(yīng)用程序代碼
    • 四、數(shù)據(jù)庫(kù)事件實(shí)時(shí)處理
    • 五、如何操作觸發(fā)器和函數(shù)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

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

2023/12/20
2970
閱讀需 10 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

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

文章速覽:

  • 觸發(fā)器和函數(shù)的基礎(chǔ)知識(shí)
  • 編寫(xiě)語(yǔ)言:從Lua到JavaScript
  • 輕松維護(hù)應(yīng)用程序代碼
  • 數(shù)據(jù)庫(kù)事件實(shí)時(shí)處理
  • 如何操作觸發(fā)器和函數(shù)

引導(dǎo)語(yǔ):

一般來(lái)說(shuō),應(yīng)用程序處理業(yè)務(wù)的邏輯,是將執(zhí)行代碼發(fā)送到數(shù)據(jù)庫(kù)。因此每次執(zhí)行函數(shù)時(shí),代碼都會(huì)從客戶端流入服務(wù)器,結(jié)果就是這個(gè)過(guò)程十分緩慢,甚至?xí)霈F(xiàn)代碼在應(yīng)用程序之間重復(fù)執(zhí)行的情況。

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

Redis Gears:四年前推出的RedisGears,是Redis平臺(tái)內(nèi)的第一個(gè)可編程模型,開(kāi)發(fā)人員能在數(shù)據(jù)所在的地方編寫(xiě)并執(zhí)行腳本。

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

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

一、觸發(fā)器和函數(shù)的基礎(chǔ)知識(shí)

觸發(fā)器和函數(shù)是通過(guò)Redis Stack提供的新一代可編程功能。它允許開(kāi)發(fā)人員直接在Redis數(shù)據(jù)庫(kù)中針對(duì)數(shù)據(jù)更改進(jìn)行編程、存儲(chǔ)和自動(dòng)執(zhí)行JavaScript代碼。

1、開(kāi)發(fā)人員可以定義事件(稱(chēng)為觸發(fā)器)來(lái)執(zhí)行更接近數(shù)據(jù)的函數(shù)。也就是說(shuō),開(kāi)發(fā)人員定義響應(yīng)數(shù)據(jù)庫(kù)事件或命令而執(zhí)行的業(yè)務(wù)邏輯。這加快了代碼和相關(guān)交互的速度,因?yàn)闊o(wú)需等待即可將代碼從客戶端引入數(shù)據(jù)庫(kù)。

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

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

二、編寫(xiě)語(yǔ)言:從Lua到JavaScript

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

三、輕松維護(hù)應(yīng)用程序代碼

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

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

四、數(shù)據(jù)庫(kù)事件實(shí)時(shí)處理

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

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

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

這里,我們介紹如何注冊(cè)一個(gè)函數(shù)和一個(gè)觸發(fā)器。當(dāng)通過(guò)TFCALL命令調(diào)用函數(shù)時(shí),函數(shù)就會(huì)被執(zhí)行;觸發(fā)器根據(jù)Redis中的事件執(zhí)行。

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

#!js name=lib api_version=1.0

2.接下來(lái),我們創(chuàng)建一個(gè)返回Redis命令結(jié)果的函數(shù)。客戶端允許在我們的函數(shù)中執(zhí)行Redis 命令。數(shù)據(jù)事件包含運(yùn)行函數(shù)時(shí)可以提供的鍵和參數(shù)。

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

3.Redis全局變量允許我們注冊(cè)觸發(fā)器和函數(shù),并記錄到日志文件中。我們?yōu)樵摵瘮?shù)注冊(cè)一個(gè)名稱(chēng),并在函數(shù)執(zhí)行時(shí)調(diào)用它。

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ā)器和函數(shù)中注冊(cè)我們的函數(shù)TFUNCTION LOAD。該TFUNCTION LOAD命令還可以在集群數(shù)據(jù)庫(kù)中分發(fā)函數(shù)庫(kù)。

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

6.現(xiàn)在我們可以使用TFCALL命令執(zhí)行該函數(shù)。該命令獲取以句點(diǎn)分隔的庫(kù)名稱(chēng)和函數(shù)名稱(chēng)。

>redis-cli TFCALL lib.playPingPong 0
PONG”

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

8.我們可以使用鍵空間觸發(fā)器拓展這個(gè)示例。我們添加了一個(gè)新的注冊(cè),該注冊(cè)對(duì)前綴為'fellowship:'的鍵做出反應(yīng)。在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(‘a(chǎn)ddLastUpdated’, 'fellowship:', addLastUpdatedField);

9. 使用帶有 REPLACE 參數(shù)的 TFUNCTION LOAD 命令來(lái)更新現(xiàn)有庫(kù)。該TFUNCTION LOAD REPLACE命令立即更新所有使用 Redis 數(shù)據(jù)庫(kù)的客戶端,并且它們會(huì)開(kāi)始使用新的業(yè)務(wù)邏輯。

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

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

了解虹科Redis企業(yè)版產(chǎn)品更多信息,歡迎前往【艾特?!抗俜骄W(wǎng)站 :https://haocst.com/

聯(lián)系虹科工程師:TEL:15528663362

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
DSC1121CM1-050.0000 1 Microchip Technology Inc OSC MEMS 50.000MHZ CMOS SMD
$1.56 查看
S25FL512SAGBHIA10 1 Cypress Semiconductor Flash, 128MX4, PBGA24, FBGA-24

ECAD模型

下載ECAD模型
$8.07 查看
SN74AHC1G14DCKT 1 Texas Instruments Single 2-V to 5.5-V inverter with Schmitt-Trigger inputs 5-SC70 -40 to 125

ECAD模型

下載ECAD模型
$0.9 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

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