---
# System prepended metadata

title: 六角鼠年鐵人賽 Week 19 - Redis - 快取伺服器介紹
tags: [w3HexSchool, Redis]

---

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

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

## 劇中佳句 3 idiots
:::info
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 所寫的表格](https://www.guru99.com/sql-vs-nosql.html)
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 支援了許多不同類型的程式語言*
![](https://i.imgur.com/sxvyv5S.png)

## 優勢與劣勢

### 高效能
所有存放進 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 等串流解決方案搭配使用做為記憶體內資料存放區，以低於一毫秒的延遲導入、處理和分析即時資料。

## 結語
:::danger
打了好多，還是沒能介紹完整，而且中間還延伸不少話題... 哈

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

首頁 [Kai 個人技術 Hackmd](/2G-RoB0QTrKzkftH2uLueA)

###### tags: `Redis`,`w3HexSchool`