各位可以想像一次大量的流量存取資料庫可能會造成資料庫的效能耗損,資料庫本身又會被硬碟的 IOPS 限制所限制,在這個時候利用 Redis
這種 Memory Cache
的工具來分散資料庫的流量就非常有用拉~今天就讓我們來聊聊 Redis吧
Redis 是一個使用 C語言
開發的 in memory
機制的 key-value
資料儲存系統,並且完全的 open source
,主要可以用於 快取
、資料儲存
與 訊息暫存
等情境。
以下整理常用的資料格式與應用的場景:
字串為最常用的一種資料格式,基本上所有場景都可以使用。
作為資料庫儲存資料,例如可以儲存使用者的資料,欄位包括:id、姓名、帳號、密碼等,通過 id 可以獲取/修改任意的欄位。
常用命令:lindex/lset/lrem/lange/llen/lpop/lpush/rpop/rpush/lpushx/rpushx
應用場景:關注列表、粉絲列表、佇列。
Sets 雖也是提供一個與 Lists 類似的列表功能,但是 Sets 是會自動排序、去重的,當需要儲存一個列表資料,又不希望有重複資料時,Sets 是一個很好的選擇,還可以取交集、並集、差集,可以應用到好友推薦、共同好友列表等,利用唯一性,可以統計訪問網站的所有獨立 IP。
Sorted Sets 是根據 score
進行排序的,內容是不重複的,因此可以應用於積分排行榜等情境。
Redis 支援 Master-Slave(主從式架構),主要是將 Master 同步至 Slave,這樣當整體的 Traffic 流量較大時,可以將一些流量導至 Slave 減輕 Master 的負擔,詳細的部分可以參考 這裡。
Redis 可以將 memory 的資料保存至硬碟中,有兩種不同的方式可以進行備份,分別為 RDB
與 AOF
,詳細的部分可以參考 這裡。
在 mac
環境可以使用 HomeBrew
來進行安裝,首先我們先將進行套件更新
brew update
接著進行 redis
的安裝
brew install redis
Redis 的啟動也可以使用 brew
指令進行
brew services start redis
可以透過 ping
的方式測試看看 redis-server 是否存活
redis-cli ping
這時如果 command line 看到回傳 PONG
,代表安裝成功拉!
我們使用 https://github.com/go-redis/redis 這個 redis client 作為與 redis 互動的媒介
可以透過 go get
的方式進行安裝
go get github.com/go-redis/redis/v8
將 package 透過 import
進行匯入。
import (
"context"
"github.com/go-redis/redis/v8"
"log"
)
透過 package 原生提供的 NewClient
方法設定連線資訊並且建立連線。
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "a12345", // no password set
DB: 0, // use default DB
})
如 安裝
步驟裡的測試一樣,可以利用剛才建立好的 client
透過 Ping
的方式測試看看連線是否成功。
pong, err := rdb.Ping(context.Background()).Result()
if err == nil {
log.Println("redis 回應成功,", pong)
} else {
log.Fatal("redis 無法連線,錯誤為", err)
}
整體測試程式如下
package main
import (
"context"
"github.com/go-redis/redis/v8"
"log"
)
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "a12345", // no password set
DB: 0, // use default DB
})
pong, err := rdb.Ping(context.Background()).Result()
if err == nil {
log.Println("redis 回應成功,", pong)
} else {
log.Fatal("redis 無法連線,錯誤為", err)
}
}
運行此程式後,如果得到的輸出為下列結果,就代表可以成功連線到 redis
拉!
2020/09/21 23:52:17 redis 回應成功, PONG
今天非常簡單的解釋了 redis
是什麼跟如何安裝與連線,也用 golang
簡單的建立了一個 client,明天就讓我們進階的利用 redis
的特性,結合昨天的公開匿名聊天室的範例,建立一個一對一的隨機匿名聊天室
吧!