0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

虹科網(wǎng)絡(luò)可視化技術(shù) ? 2023-12-09 08:05 ? 次閱讀

一般來(lái)說(shuō),應(yīng)用程序處理業(yè)務(wù)的邏輯,是將執(zhí)行代碼發(fā)送到數(shù)據(jù)庫(kù)。因此每次執(zhí)行函數(shù)時(shí),代碼都會(huì)從客戶(hù)端流入服務(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ù)邏輯。

01

觸發(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ú)需等待即可將代碼從客戶(hù)端引入數(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í)行讀取操作,這些操作可以從任何槽訪(fǎng)問(wèn)數(shù)據(jù),甚至在集群數(shù)據(jù)庫(kù)中也是如此,因此可以從每個(gè)函數(shù)訪(fǎng)問(wèn)所有數(shù)據(jù)。

02

編寫(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ā)人員的采用成本。

03

應(yīng)用程序代碼更容易維護(hù)

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

當(dāng)多個(gè)應(yīng)用程序訪(fǎ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)。

04

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

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

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

05

如何操作觸發(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ù)??蛻?hù)端允許在我們的函數(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.jsOK

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ù)的客戶(hù)端,并且它們會(huì)開(kāi)始使用新的業(yè)務(wù)邏輯。

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

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

8f46bc16-9626-11ee-9788-92fbcf53809c.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6760

    瀏覽量

    88619
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    1992

    瀏覽量

    60978
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4260

    瀏覽量

    62231
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是觸發(fā)器 觸發(fā)器的工作原理及作用

    ,并根據(jù)其差異采取對(duì)策。實(shí)際應(yīng)用盡管觸發(fā)器有很多優(yōu)點(diǎn),但是在實(shí)際的項(xiàng)目開(kāi)發(fā)中,特別是OOP思想的深入,觸發(fā)器的弊端也逐漸突顯,主要:1、過(guò)多的觸發(fā)器使得數(shù)據(jù)邏輯變得復(fù)雜2、數(shù)據(jù)操作比較
    發(fā)表于 12-25 17:09

    JK觸發(fā)器,JK觸發(fā)器是什么意思

    JK觸發(fā)器,JK觸發(fā)器是什么意思 1.主從JK觸發(fā)器主從結(jié)構(gòu)觸發(fā)器也可以徹底解決直接控制,防止空翻。這里以性能優(yōu)良、廣泛使用的主從JK觸發(fā)器
    發(fā)表于 03-08 13:36 ?6670次閱讀

    什么是RS觸發(fā)器,RS觸發(fā)器的工作原理是什么?

    什么是RS觸發(fā)器,RS觸發(fā)器的工作原理是什么? 主從RS觸發(fā)器
    發(fā)表于 03-08 14:00 ?3.1w次閱讀

    施密特觸發(fā)器,施密特觸發(fā)器是什么意思

    施密特觸發(fā)器,施密特觸發(fā)器是什么意思 施密特觸發(fā)器也有兩個(gè)穩(wěn)定狀態(tài),但與一般觸發(fā)器不同的是,施密特觸發(fā)器采用電位
    發(fā)表于 03-08 14:14 ?1928次閱讀

    什么是邊沿觸發(fā)器_邊沿D觸發(fā)器介紹

    邊沿觸發(fā)器,指的是接收時(shí)鐘脈沖CP 的某一約定跳變(正跳變或負(fù)跳變)來(lái)到時(shí)的輸入數(shù)據(jù)。在CP=l 及CP=0 期間以及CP非約定跳變到來(lái)時(shí),觸發(fā)器不接收數(shù)據(jù)
    發(fā)表于 01-31 09:02 ?7.1w次閱讀
    什么是邊沿<b class='flag-5'>觸發(fā)器</b>_邊沿D<b class='flag-5'>觸發(fā)器</b>介紹

    觸發(fā)器的作用_觸發(fā)器的特點(diǎn)介紹

    本文開(kāi)始介紹了觸發(fā)器的定義和觸發(fā)器的特點(diǎn),其次闡述了觸發(fā)器的分類(lèi)和觸發(fā)器的作用,最后介紹了觸發(fā)器的工作原理。
    發(fā)表于 03-27 17:35 ?2.2w次閱讀

    觸發(fā)器觸發(fā)器的作用

     觸發(fā)器是一種用來(lái)保障參照完整性的特殊的存儲(chǔ)過(guò)程,它維護(hù)不同表中數(shù)據(jù)間關(guān)系的有關(guān)規(guī)則。當(dāng)對(duì)指定的表進(jìn)行某種特定操作(如:Insert,Delete或Update)時(shí),觸發(fā)器產(chǎn)生作用。觸發(fā)器
    發(fā)表于 07-12 10:05 ?2.5w次閱讀
    <b class='flag-5'>觸發(fā)器</b>及<b class='flag-5'>觸發(fā)器</b>的作用

    電平觸發(fā)器,脈沖觸發(fā)器和邊沿觸發(fā)器觸發(fā)因素是什么

    脈沖觸發(fā)器由兩個(gè)相同的電平觸發(fā)的SR觸發(fā)器組成,其中左SR觸發(fā)器成為主觸發(fā)器,右手側(cè)稱(chēng)為從觸發(fā)器
    的頭像 發(fā)表于 02-11 10:56 ?9082次閱讀
    電平<b class='flag-5'>觸發(fā)器</b>,脈沖<b class='flag-5'>觸發(fā)器</b>和邊沿<b class='flag-5'>觸發(fā)器</b>的<b class='flag-5'>觸發(fā)</b>因素是什么

    什么是觸發(fā)器?觸發(fā)器的作用是什么?觸發(fā)器觸發(fā)方式

    什么是觸發(fā)器?觸發(fā)器的作用是什么?觸發(fā)器觸發(fā)方式 觸發(fā)器是一種在數(shù)據(jù)庫(kù)中執(zhí)行自動(dòng)化操作的工具。
    的頭像 發(fā)表于 08-24 15:50 ?8279次閱讀

    觸發(fā)器的輸出是現(xiàn)態(tài)函數(shù)

    觸發(fā)器的輸出是現(xiàn)態(tài)函數(shù) 觸發(fā)器是數(shù)字電路中的一種重要元件,它們通常被用于存儲(chǔ)和裝載二進(jìn)制數(shù)據(jù),也可以用于控制和同步各種數(shù)字電路。在許多數(shù)字電路應(yīng)用中,
    的頭像 發(fā)表于 08-24 15:50 ?909次閱讀

    觸發(fā)器激勵(lì)函數(shù)和輸出函數(shù)解析

    觸發(fā)器激勵(lì)函數(shù)和輸出函數(shù)解析? 觸發(fā)器是數(shù)字電路中的一種重要的組合邏輯電路,其可以達(dá)到存儲(chǔ)、延時(shí)、計(jì)數(shù)等功能。觸發(fā)器有多種類(lèi)型,如SR
    的頭像 發(fā)表于 08-24 15:50 ?2583次閱讀

    JK觸發(fā)器與T觸發(fā)器的Verilog代碼實(shí)現(xiàn)和RTL電路實(shí)現(xiàn)

    JK 觸發(fā)器的 Verilog 代碼實(shí)現(xiàn)和 RTL 電路實(shí)現(xiàn)
    的頭像 發(fā)表于 10-09 17:29 ?4011次閱讀
    JK<b class='flag-5'>觸發(fā)器</b>與T<b class='flag-5'>觸發(fā)器</b>的Verilog<b class='flag-5'>代碼</b>實(shí)現(xiàn)和RTL電路實(shí)現(xiàn)

    觸發(fā)器的基本性質(zhì) 觸發(fā)器觸發(fā)方式分為哪三種

    是邏輯表達(dá)式、狀態(tài)改變或特定事件的發(fā)生。當(dāng)這些條件滿(mǎn)足時(shí),觸發(fā)器將被激活并執(zhí)行各種動(dòng)作。 觸發(fā)動(dòng)作:觸發(fā)器在被激活后,將執(zhí)行一系列特定的動(dòng)作或事件。這些動(dòng)作可以是觸發(fā)其他程序或
    的頭像 發(fā)表于 01-23 16:10 ?3116次閱讀

    d觸發(fā)器和jk觸發(fā)器的區(qū)別是什么

    ,可以存儲(chǔ)一位二進(jìn)制信息。觸發(fā)器的輸出狀態(tài)取決于輸入信號(hào)和觸發(fā)器的當(dāng)前狀態(tài)。觸發(fā)器的分類(lèi)主要有D觸發(fā)器、JK觸發(fā)器、T
    的頭像 發(fā)表于 08-22 10:37 ?620次閱讀

    怎么用jk觸發(fā)器變成t觸發(fā)器

    將JK觸發(fā)器變成T觸發(fā)器,主要涉及到對(duì)JK觸發(fā)器的輸入端口進(jìn)行適當(dāng)?shù)倪B接和配置,以實(shí)現(xiàn)T觸發(fā)器的邏輯功能。以下是將JK觸發(fā)器轉(zhuǎn)換為T(mén)
    的頭像 發(fā)表于 08-28 09:41 ?537次閱讀