iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
Modern Web

Go into Web!系列 第 21

Day21 | 淺談 redis

各位可以想像一次大量的流量存取資料庫可能會造成資料庫的效能耗損,資料庫本身又會被硬碟的 IOPS 限制所限制,在這個時候利用 Redis 這種 Memory Cache 的工具來分散資料庫的流量就非常有用拉~今天就讓我們來聊聊 Redis吧

Redis

Redis 是什麼

Redis 是一個使用 C語言 開發的 in memory 機制的 key-value 資料儲存系統,並且完全的 open source,主要可以用於 快取資料儲存訊息暫存等情境。

支援的資料格式與應用情境

以下整理常用的資料格式與應用的場景:

String

應用情境

字串為最常用的一種資料格式,基本上所有場景都可以使用。

Hashes

應用情境

作為資料庫儲存資料,例如可以儲存使用者的資料,欄位包括:id、姓名、帳號、密碼等,通過 id 可以獲取/修改任意的欄位。

Lists

常用命令:lindex/lset/lrem/lange/llen/lpop/lpush/rpop/rpush/lpushx/rpushx
應用場景:關注列表、粉絲列表、佇列。

Sets

應用情境

Sets 雖也是提供一個與 Lists 類似的列表功能,但是 Sets 是會自動排序、去重的,當需要儲存一個列表資料,又不希望有重複資料時,Sets 是一個很好的選擇,還可以取交集、並集、差集,可以應用到好友推薦、共同好友列表等,利用唯一性,可以統計訪問網站的所有獨立 IP。

Sorted Sets

應用場景

Sorted Sets 是根據 score 進行排序的,內容是不重複的,因此可以應用於積分排行榜等情境。

高可用

Redis 支援 Master-Slave(主從式架構),主要是將 Master 同步至 Slave,這樣當整體的 Traffic 流量較大時,可以將一些流量導至 Slave 減輕 Master 的負擔,詳細的部分可以參考 這裡

資料保留

Redis 可以將 memory 的資料保存至硬碟中,有兩種不同的方式可以進行備份,分別為 RDBAOF,詳細的部分可以參考 這裡

環境

安裝

mac 環境可以使用 HomeBrew 來進行安裝,首先我們先將進行套件更新

brew update

接著進行 redis 的安裝

brew install redis

啟動

Redis 的啟動也可以使用 brew 指令進行

brew services start redis

測試

可以透過 ping 的方式測試看看 redis-server 是否存活

redis-cli ping

這時如果 command line 看到回傳 PONG,代表安裝成功拉!

透過 Go 與 Redis 進行互動

我們使用 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"
)

建立 client

透過 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 的特性,結合昨天的公開匿名聊天室的範例,建立一個一對一的隨機匿名聊天室吧!

參考


上一篇
Day20 | 製作一個公開匿名聊天室 - 後端篇
下一篇
Day22 | 結合 Redis 實作隨機一對一匿名聊天室
系列文
Go into Web!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言