# 六角鼠年鐵人賽 Week 24 - Spring Boot - Redis 特色功能介紹 ==大家好,我是 "為了拿到金角獎盃而努力著" 的文毅青年 - Kai== ## Elon Musk :::info When something is important enough, you do it even if the odds are not in your favor. ::: ## 主題 這週的文章算是要把 Redis 其他一些特色功能給做一個整理,接下來就要去寫其他文章了~ 在前幾週介紹了 Redis 的基本、資料結構、以及 Pub/Sub 功能外,其實 Redis 還支援了許多諸如 HyperLogLog 處理、腳本執行等服務,幫助開發者省下額外的開發時程。 ## HyperLogLog 服務 如果不知道什麼是 HyperLogLog 的人可以先看看這篇文章 2019-09-12 由 xy的技術圈 發表于程式開發 [一篇文章學懂Redis HyperLogLog](https://kknews.cc/zh-tw/code/2yggq9z.html) 簡單來說,開發人員常會需要去計算一些固定增加的數值資料,例如: 登入人次、瀏覽人次等等,不管事運用 Set 或 bitmaps 這種資料結構去儲存基數記數的資料都會累積的越來越肥大造成讀取效益越來越低落的情況,為此 HyperLogLog 演算法的應用,讓開發人員可以在一定的誤差條件內,**高效**的取得**近似值**的結果。 注意是**高效**和**近似值**! 相信從業工程師的人應該不難理解,要在時間、成本、範疇取得品質上的平衡是非常非常難以拿捏的事情。因此 HyperLogLog 的方式雖然存在一定誤差,但也提供了一個無疑是最佳解的方式。尤其以 Redis 只需要12K的內存,在標準差0.81%的前提下,能夠統計2^64個數據的情況來說,找不到更高效的替代方式了。 ![](https://epaper.geo.com.tw/ImageUpLoad/ShowImage?dXJsJTNkYUhSMGNITWxNMkVsTW1ZbE1tWmxjR0Z3WlhJdVoyVnZMbU52YlM1MGR5VXlaa2x0WVdkbGN5VXlabFZ3Ykc5aFpFbHRZV2RsSlRKbU1USTJKVEptY0RFdWFuQm4lMjZsaXN0U2VxJTNkMTE5ODY5NSUyNmNvbnRlbnRzU2VxJTNkMjk3OSUyNmNvbmZpZ1NlcSUzZDIzMQ==) 稍微介紹過後,來看看以下 Redis 提供 HyperLogLog 的操作指令: | 指令 | 描述 | 備註 | | ---- | ---- | ---- | | PFADD [key_name] [element_1] [element_2] ... | 將指定的 Element 加入指定 Key 的 HyperLogLog 當中 || | PFCOUNT [key_name1] [key_name2] ... | 將計算指定的 Keys 並返為統計記數 | 若 key 不存在則返回 0 | | PFMERGE [destKey] [sourceKey1] [sourceKey2] ... | 將指定的 SourceKeys 通通合為一個 DestKey || ## Transaction 事務處理 Redis 雖然是 NoSQL,但對於 Transaction 的部分也提供了一些服務,讓開發人員在操作 Redis 時,可以類似於 RDBMS 的方式比較順手,針對資料的部分處理也比較方便。 但 Redis 並不支持 Roll-Back 功能,因此在操作 Transaction 的時候,務必在處理前就已經把資料的部份給偵錯和校正完成,避免髒資料進入後難以回溯。 以下就是 Redis 提供的 Transaction 操作指令: | 指令 | 描述 | 備註 | | ---- | ---- | ---- | | MULTI | 標記 Transaction 的開始,後續所有的操作指令都會被寫入 QUEUED 中 | 永遠會回傳 1,後續操作指令會回傳 QUEUED | | EXEC | 處理所有儲存在 QUEUED 中的操作 || | DISCARD | 清空所有儲存在 QUEUED 中的操作 | 需要在 MULTI 之後才能下此指令,否則會返回無法找到 MULTI 的錯誤訊息| | WATCH [key_name1] [key_name2] ... | 針對指定 Keys 進行監視,當 Keys 在被 Watch 後有被任何 Client 端修正的狀況,則 Server 端的 Transaction 將不會執行,直接返回失敗 || | UNWATCH | 取消所有 Keys 的監視 || ## Lua 腳本處理 Redis 在 2.6 版本內嵌支持 Lua scripts 的功能,解決無法高效率的處理 CAS (Check-And-Set ) 命令的缺點。 什麼是 Lua? Lua 是一種輕量級的腳本語言,是用 C 語言編寫而成,被設計出來的目的是為了嵌入應用程式當中,從而替應用程式提供靈活的腳本應用範疇。 Lua 支持了 Procedure-Oriented 和 Functional Programming 的開發方式,並有自動內存管理的功能,支援處理數值、Hash、Collection、Object 的資料結構。 一些開發人員常用的 OOP 機制也有被設計在 Lua 中: 抽象、介面、繼承、重載等。 目前 Lua 大多嵌入在遊戲開發軟體、Web App、資料庫 Plugin 等方面。 Redis 目前提供關於 Lua 的操作指令如下: | 指令 | 描述 | 備註 | | ---- | ---- | ---- | | EVAL [scripts] [number_keys] [key_name1] [key_name2] ... [arg...] | 使用 EVAL 執行 Lua scripts 指令,並限定 number_keys 數量的 key_name1,key_name2 等 | | EVALSHA [sha1_scripts] [number_keys] [key_name1] [key_name2] ... [arg...] | 當一個 EVAL 的指令成功後,它會產出一組 SHA1 的資料,隨後針對這個 SHA1 使用 EVALSHA 的指令皆會得到一樣的結果,可以視為一個 scripts 在操作後會得到一組專屬的ID,使用這 ID 等同於使用該 scripts || | SCRIPTS EXISTS [scripts] | 查詢 scripts 是否存在於緩存中 || | SCRIPTS FLUSH | 刪除所有緩存中的 scripts || | SCRIPT KILL | 刪除目前正在執行中的腳本 || | SCRIPT LOAD [scripts] | 載入指定的 scripts 到緩存中 || ## 其他的操作指令 剩餘的功能比較零散,但還是有重要的指令可以學學 | 指令 | 描述 | 備註 | | ---- | ---- | ---- | | SAVE | 創建一個備份當前 DB 的 dump.rdb 文件在 Redis 目錄中 | ※此為關於 Redis 資料持久化處理的部分,後續文章會提| | BGSAVE | 在背景執行 SAVE 功能 | ※此為關於 Redis 資料持久化處理的部分,後續文章會提| | PING | 檢查 Server 端是否正在運行 | 會回傳 PONG | | QUIT | 關閉當前連接 || | SELECT [index] | 更改當前要連接的資料庫 | | ECHO [message] | 讓 Redis print 出 message || ## 結語 :::danger 這週的文章很短,也算是盡快把 Redis 剩餘的功能給介紹完了。 接下來幾週要開始準備學學 Activity 這個看起來對於開發上很好用的框架了。 若有斷文請見諒,學學新東西然後整理給大家知道真的不是那麼容易,加上上班偶爾會碰到需要加班處理的狀況,有時候有 這幾週開始分享 Spring Data & JPA 的教學 [六角鼠年鐵人賽 Week 25 - Spring Boot - Spring Data & JPA 介紹](/J_SpvD2ASN61ZaY-SCPSxA) ::: 首頁 [Kai 個人技術 Hackmd](/2G-RoB0QTrKzkftH2uLueA) ###### tags: `Redis`,`w3HexSchool`