【虹科乾貨】觸發器和函式:讓程式碼更接近資料
文章速覽:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 虹科乾貨| 虹科Redis企業版資料庫:告別遊戲卡頓,讓快樂加速!Redis資料庫遊戲
- 【虹科乾貨】關於JSON資料庫JSON資料庫
- 【虹科乾貨】無模式資料庫的利與弊模式資料庫
- 虹科乾貨 | 資料庫的九大關鍵功能介紹資料庫
- 【虹科乾貨】Lambda資料架構和Kappa資料架構——構建現代資料架構架構APP
- JavaScript修飾器-讓程式碼更乾淨JavaScript
- 【虹科乾貨】使用記憶體資料庫解決三個資料庫效能問題記憶體資料庫
- 【虹科乾貨】5個關於微服務的誤解微服務
- 【虹科乾貨】設計微服務架構的原則微服務架構
- 虹科乾貨|Redis企業版資料庫為企業「資料安全」疊加最強Buff!Redis資料庫
- 虹科乾貨 | 零售業數智升級不掉隊,get資料,get未來!
- js程式碼觸發事件 函式列表JS事件函式
- 虹科乾貨 | Redis企業版—比Redis開源更好用!Redis
- 虹科乾貨 | 什麼是商業智慧 (BI) 儀表板?
- 【虹科乾貨】Redis 開發者需要了解的快取驅逐策略Redis快取
- 虹科乾貨 | 一文詳解Redis企業版軟體!Redis
- 虹科分享|被困雲端?虹科Redis企業版資料庫來解救!Redis資料庫
- 頭歌資料庫實驗七:函式與觸發器資料庫函式觸發器
- JavaScript中使用bind()方法讓程式碼更乾淨JavaScript
- 虹科分享 | 虹科Redis企業版資料庫如何支援實時金融服務?Redis資料庫
- 【虹科乾貨】Redis Enterprise vs ElastiCache——如何選擇快取解決方案?RedisAST快取
- 虹科分享|虹科Redis企業版資料庫帶你跑贏MySQL數字時代!Redis資料庫MySql
- 虹科案例 | 虹科Domo商業智慧,助力保險公司逃離繁雜資料池!
- C#6新特性,讓你的程式碼更乾淨C#
- 七、函式-儲存過程-觸發器函式儲存過程觸發器
- 【虹科乾貨】零售商們正在尋找實時庫存解決方案
- 【MySQL】MySQL(三)儲存過程和函式、觸發器、事務MySql儲存過程函式觸發器
- ORA-04091 觸發器/函式不能讀觸發器函式
- 虹科分享 | 資料庫效能翻3倍:虹科Redis企業版的RoF是如何做到的?資料庫Redis
- 【虹科乾貨】Oracle與Redis Enterprise協同,作為企業快取解決方案OracleRedis快取
- 讓科學重回資料科學資料科學
- 【乾貨】MySQL資料庫開發規範MySql資料庫
- 好程式設計師分享乾貨 彈性分散式資料集RDD程式設計師分散式
- 乾淨的程式碼: 編寫可讀的函式函式
- 讓你的Python程式碼更乾淨只需簡單一步Python
- 編寫觸發器實現兩張表資料同步,sql程式碼如下:觸發器SQL
- MySQL怎麼利用函式和觸發器實現非主鍵自增?MySql函式觸發器
- 「技術乾貨」工業觸控式螢幕之觸控式螢幕分類(連載)