Try   HackMD

六角鼠年鐵人賽 Week 19 - Redis - 快取伺服器介紹

大家好,我是 "為了拿到金角獎盃而努力著" 的文毅青年 - Kai

劇中佳句 3 idiots

Chase Excellence,Sucess will follow.

主題

作為 MessageQueue (簡稱MQ) 的第一個主題,果然還是想先學學 Redis,這一款號稱輕量、極高效率聞名的快取伺服器,也是入門 MQ 世界的好標的。

但是

Redis 並不是 MQ!
Redis 並不是 MQ!
Redis 並不是 MQ!

很重要,強調三次!

Redis 是一個 分散式、支援持久化、使用 key-value 做資料處理的快取伺服器,或者應該用最熱門的詞彙來說明更貼切 NoSQL

不懂 NoSQL 沒關係,等等下方會有一個簡單的介紹與比較。

總之,Redis 並非是專門做 MQ 的套件,但是它可以支援 MQ 的功能,也因為傳聞中它好學,Kai 才會當作 MQ 的第一個目標。

SQL & NoSQL

SQL

一般常見的 MySQL, Oracle, SQL 都是傳統關聯式資料庫(RDBMS),顧名思義其資料架構為由資料庫包覆資料表,表與表之間生成關聯型態以此鍵結資料關係的架構。

在這之中,資料庫與資料表的定義都是預先設置的,這表示資料存儲須要事先格式化過,才能確保資料的一致,從而能夠統整出碩大且工整的數據表。

RDBMS 優點

  • 結構化查詢語言 (就是 SQL)
  • ACID 一應具全 (原子性,一致性,隔離性,持久性)
  • 技術十分成熟,社群資源非常多

RDBMS 缺點

  • 縱向發展,對於維持效能的代價過於龐大

    雖然資料表可建立 index,但資料量越多還是會造成查詢效能上的低落

  • 橫向發展的不如 NoSQL 方便
  • 動態資料的存儲非常困難

NoSQL

NoSQL (Not only SQL) 剛好相反,它不在乎資料內的物件型態是否一致,也不在乎資料與資料之間的關聯。你可以在一筆資料中增添五個物件,也可以指放入一個數值,這些都是被允許的事情。

與 RDBMS 相反的事實是,NoSQL 可以說更貼近真實資料的型態。
對於開發人員來說,作業上須要挑整重心在解析資料上,而減少部分存儲方面的工作。

NoSQL 優點

  • 少量資源便可拓展資料中心,達到高度的橫向發展
  • 支援動態資料,非常適合處理非結構化的巨量資料

NoSQL 缺點

  • 缺乏標準化的處理方式,無法一套SQL打天下
  • 僅能在 CAP 中三選二 (一致性,可用性,分區容忍度)
  • 缺乏效能測試和分析工具
  • 技術過於新穎,社群資源難以找尋

然而,天秤的兩端總是平衡的,並沒有哪一種方式絕對好或壞,完全要端看業務的需求而定。

新創商業用 NoSQL 來做沒有問題。
金融保險就非得使用嚴謹的 RDBMS 才能符合規範。

以下是列出在 guru99 所寫的表格
Kai 覺得該位大神整理的很棒,在這也把它翻譯成中文,讓大家更好閱讀,中間可能穿插了部分個人的領悟和解讀,若對於內容有所疑慮不妨可以直接查看原文。

SQL V.S. NoSQL

SQL NoSQL
定義 通常指 RDBMS,也稱傳統關聯式資料庫 非關聯式資料庫,或稱分布式資料庫
設計 使用結構化查詢語言做 OLAP(線上分析處理) 各個不同的軟體皆是滿足特定需求而打造的,需要視情況做使用
使用語言 SQL 依照軟體不同
類型 基於資料表 基於 Key-Value
架構 預定義架構 動態架構
擴展能力 縱向擴展 (花費為指數線性成長) 橫向擴展 (花費為常數線性成長)
常見軟體 MySQL, Oracle, PostgresSQL, MS-SQL MongoDB, Redis, , Neo4j, Cassandra, Hbase
適合對象 時常需要高度複雜性查詢的業務 不適合複雜查詢 (適合快速、多量、簡單的查詢結果)
變化 一種類型、多種變化 許多不同類型: Key-Value, 文檔, 圖型資料庫等
發展歷程 1970年起,主要尋求處理平面文檔的存儲的方式 2000年後,主要尋求補足SQL的缺點與高拓展性
開源程度 開源與鎖源的軟體都有 幾乎開源
軟體一致性 SQL 軟體大多數相似 依照不同軟體有不同資料規範存儲的要求
適合的使用情景 需要解決 ACID 問題 需要解決資料可用性問題
重點目標 資料正確性比速度更重要時 速度比資料正確性更重要時
最佳選擇 當需要處理動態Query時 當需要根據變化進行拓展時
硬體選擇 專用的特規硬體 (Oracle Exadata等) 一般硬體
網路選擇 高速網路 (Infiniband、Fabric Path等) 一般網路
儲存選擇 高速儲存硬體設備 (SAN、RAID等) 一般儲存硬體設備 (一般HDDs、JBOD)
優勢 跨平台、安全、免費(MySQL等) 容易使用、高性能、彈性
著名使用於商業的公司 Hootsuite, CircleCI, Gauges Airbnb, Uber, Kickstarter
專業人員平均薪資(美國) $84,328美金/年 (約253萬) $72,174美金/年 (約216萬5千)

Redis

講這麼多終於要進入正題

Redis 是由 Salvatore Sanfilippo 使用 C 語言開發的 NoSQL,基於當時對 MySQL 效能低落的無奈與傳統 RDBMS 的使用束縛,Salvatore Sanfilippo 花了一年時間親手打造的了 Redis

工程師的夢想: 看不順眼的事物,就自己建一個 (?

在 2009 年釋出第一版後,Redis 並沒有進行鎖源,而是開源。

這讓想擴充功能的工程師可以協助參與開發工作,因此 Redis 獲得了程式界廣大的回響,一直到 2020 年 Redis 已經發布到了版本 6.0,達到了面相多種不同語言的環境都能提供完整功能與服務的境界。

來自官方的圖片,可以看到 Redis 支援了許多不同類型的程式語言

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

優勢與劣勢

高效能

所有存放進 Redis 的資料,都會被放置在 Redis 自己伺服器的主記憶體位置,這意味著資料並不需要進出磁碟,而 Redis 簡單的儲存結構也讓 CPU 能使用較少的資源取得同樣的結果。

這樣的結果就是,通常操作都可以在 一毫秒 內完成。

資料結構

Redis 提供了多種常見的資料結構,如: String, Hash, List, Set, Sorted Set 等,最高可以保存單筆達 512 MB 的資料進入主記憶體中。

多功能

Redis 除了作為 NoSQL 形式的 DB 外,另外還有 Pub/Sub, Transactions 等好用的功能,能夠做到 MessageQueue、串流等業務

複寫 和 持久化

作為 NoSQL 一員的 Redis,也相同的使用主從式架構,橫向發展的方式讓其可以擴充許多從屬伺服器,增加讀取效能的同時也附帶將資料保持在記憶體空間中更久。

Redis 也支援非同步的復寫功能和時間點快照功能,兩者都可以幫助 Redis 發生問題時快速恢復資料

  • 非同步復寫功能
    • 在主伺服器發生問題,可以利用從屬伺服器將資料救回,避免憾事發生。
  • 時間點快照功能
    • 將資料複製到磁碟,建立 Append Only File (AOF),並將每一次的資料變更都寫入磁碟中(可以設定為每一秒作一次),直到下一次資料複製到磁碟蓋過去後,重新刷新資料變更的紀錄。

支援多語言

最一開始的介紹就有提到了,Redis 發展至今目前支援共 51 種語言,幾乎可以說是所有軟韌體工程師都可以使用的一個軟體。

資料結構

Redis 作為一個 快取伺服器,理所當然地會有它需要去架構和連線的方式,而它儲存資料的方式也是我們常見的 Key-Value 形式。

  • String
  • Hash
  • List
  • Set
  • Sorted Set

功能

  • Pub/Sub (Publish/Subscribe)
    • Redis 提供針對一個 Key 進行 Pub/Sub 設定,意即當該 Key 有新訊息進行 Pub 時,所有 Sub 的客戶端都會收到新的訊息。
    • 常見於即時聊天社群平台等應用。
  • Transactions
    • Redis 是少數能夠提供類似於 SQL ACID 性質 Transactions 的軟體,並有提供 WATCH 命令得以監控執行期間資料是否被異動,若被異動,則整個 Transaction 會取消。
    • 此外 Redis 並不支援 Roll Back 功能,這是因其面向產品而生的軟體,因此極其單純的僅是處理送入的指令,而這種錯誤通常在開發環節就 "應該" 要被修正,因此 Redis 並不提供任何過於複雜的機制,此包含了 Roll Back 功能。

服務應用

  • 快取
    • 高效能的記憶體快取方式讓 Redis 減少I/O磁碟的延遲,搭配主從式可擴展架構,讓 Redis 在這項服務應用上幾乎是頂標的存在
  • 工作階段管理
    • 很多服務都有儲存暫時更新資料內容的功能,Redis 透過複寫和時間點快照的方式,可支援大量未確定的工作階段內容,從而達到線上訊息暫存的功能,常應用在許多遊戲、電商、社群平台上。
  • 排行榜
    • 許多遊戲或是電商活動都有推出類似的排行榜活動,靜態的排行榜絕對無法即時反應狀況,而 Redis 吞吐資料的速度非常之快,讓他可以達到近乎即時更新的速度,也讓動態排行榜這功能幾乎離不開使用 Redis。
  • 流量管制、速率限制
    • Redis 可當作測量的工具,讓網站或線上服務可以視流量狀況作自動化的調整,避免因突發性的爆量而導致 Shut Down 狀況發生。
    • 也有部分功能是拿來作搶票機制,例如航空或傳播媒體的活動等。
  • 媒體串流
    • Redis 提供存放中繼資料的方式,讓媒體可以一次串流到數百萬行動裝置或電腦上
  • 佇列
    • Redis 資料結構提供 Atomic 操作和封鎖功能,可用於需要可靠的訊息代理程式或循環清單的各種應用程式中。
  • 對談訊息
    • Redis 提供 Pub/Sub 功能,讓其能夠支援高效能的聊天室、註解串流、社群媒體通訊等功能。
  • ML (Machine Learning)
    • Redis 提供快速的記憶體內資料存放區讓您迅速建立、訓練和部署機器學習模型。
  • 即時分析
    • Redis 可與 Apache Kafka 和 Amazon Kinesis 等串流解決方案搭配使用做為記憶體內資料存放區,以低於一毫秒的延遲導入、處理和分析即時資料。

結語

打了好多,還是沒能介紹完整,而且中間還延伸不少話題

這篇篇幅不夠僅能做概略的介紹,下一篇文章 Kai 將會分享 Redis 的實務操作方式的學習心得
六角鼠年鐵人賽 Week 20 - Spring Boot - Redis 安裝與設定配置介紹

首頁 Kai 個人技術 Hackmd

tags: Redis,w3HexSchool