使用Go語言啟動(dòng)Redis的實(shí)例詳解
最近寫了幾篇 Go 并發(fā)編程相關(guān)的文章,想必有些讀者看多了可能會(huì)有些厭倦,今天來點(diǎn)輕松的內(nèi)容,介紹一個(gè)可以用來啟動(dòng) redis-server 的開源庫(kù) github.com/stvp/tempredis。這是一個(gè)用 Go 語言開發(fā)的包,專門用于創(chuàng)建臨時(shí)的 Redis 實(shí)例,主要用于測(cè)試目的。它可以在本地啟動(dòng)一個(gè)臨時(shí)的 Redis 服務(wù)實(shí)例,在測(cè)試結(jié)束后自動(dòng)關(guān)閉并清理,幫助開發(fā)者避免對(duì)實(shí)際的 Redis 環(huán)境進(jìn)行操作。
主要功能
tempredis 包主要功能如下:
- 快速啟動(dòng)臨時(shí) Redis 實(shí)例:無需手動(dòng)安裝和配置 Redis,只要系統(tǒng)上已經(jīng)安裝了 Redis 二進(jìn)制文件(
redis-server)。 - 獨(dú)立的測(cè)試環(huán)境:每個(gè)測(cè)試運(yùn)行一個(gè)獨(dú)立的 Redis 實(shí)例,避免了測(cè)試之間的相互干擾。
- 自動(dòng)清理:測(cè)試完成后,臨時(shí)實(shí)例會(huì)被關(guān)閉,相關(guān)文件會(huì)被刪除。
環(huán)境準(zhǔn)備
首先,主機(jī)上當(dāng)然要安裝 Redis 二進(jìn)制文件和安裝 tempredis Go 包:
# mac 電腦直接使用 brew 即可安裝 redis-server # 其他平臺(tái)可以參考官方文檔:https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/ $ brew install redis # 安裝 tempredis Go 包 $ go get -u github.com/stvp/tempredis
簡(jiǎn)單介紹
可以在 tempredis 文檔 中看到其實(shí)現(xiàn)的 exported 結(jié)構(gòu)體和方法:
type Config
func (c Config) Socket() string
type Server
func Start(config Config) (server *Server, err error)
func (s *Server) Kill() (err error)
func (s *Server) Socket() string
func (s *Server) Stderr() string
func (s *Server) Stdout() string
func (s *Server) Term() (err error)
Config 結(jié)構(gòu)體實(shí)際上就是一個(gè) map[string]string 對(duì)象,用于設(shè)置 Redis 配置。它的 Socket 方法用于返回 redis.sock 文件位置。
Server 結(jié)構(gòu)體代表一個(gè) Redis 實(shí)例對(duì)象,幾個(gè)方法作用分別如下:
Start是一個(gè)函數(shù),用于根據(jù)給定的配置Config啟動(dòng)Server。Kill方法用于強(qiáng)制關(guān)閉redis-server。Term方法用于優(yōu)雅關(guān)閉redis-server。Socket方法會(huì)代理到Config.Socket方法調(diào)用。Stdout方法阻塞等待返回redis-server執(zhí)行后的標(biāo)準(zhǔn)輸出。Stderr方法阻塞等待返回redis-server執(zhí)行后的錯(cuò)誤輸出。
使用示例
我們已經(jīng)對(duì) tempredis 提供的方法有了初步的了解,那么是時(shí)候?qū)懸粋€(gè)小 demo 練練手了,示例代碼如下:
package main
import (
"fmt"
"log"
"time"
"github.com/go-redis/redis"
"github.com/stvp/tempredis"
)
func main() {
// 創(chuàng)建并啟動(dòng)一個(gè)臨時(shí)的 Redis 實(shí)例
server, err := tempredis.Start(tempredis.Config{
"port": "0", // 自動(dòng)分配端口
})
if err != nil {
log.Fatalf("Failed to start tempredis: %v", err)
}
// 放在 defer 中執(zhí)行,避免阻塞 main goroutine
defer func() {
fmt.Println("====================== stdout ======================")
fmt.Println(server.Stdout())
fmt.Println("====================== stderr ======================")
fmt.Println(server.Stderr())
}()
// main 退出時(shí)關(guān)閉 redis-server
defer server.Term()
// 獲取 Redis 的地址
fmt.Println("Redis server is running at", server.Socket())
// 連接臨時(shí)的 Redis 實(shí)例
client := redis.NewClient(&redis.Options{
Network: "unix",
Addr: server.Socket(),
})
// 使用 Redis 實(shí)例
client.Set("name", "jianghushinian", time.Second)
val, err := client.Get("name").Result()
if err != nil {
fmt.Println("Get redis key error:", err)
return
}
fmt.Println("name:", val)
time.Sleep(time.Second)
// 1s 后 name 已經(jīng)過期
val, err = client.Get("name").Result()
if err != nil {
fmt.Println("Get redis key error:", err)
return
}
fmt.Println("name:", val)
}
代碼中每個(gè)部分我都寫了注釋說明,不難理解。在啟動(dòng)臨時(shí)的 Redis 實(shí)例后,可以使用任何 Go Redis 客戶端進(jìn)行連接,這里使用的是 go-redis/redis。之后就可以正常使用 Redis 的功能了。
執(zhí)行示例代碼,得到輸出如下:
$ go run main.go
Redis server is running at /var/folders/_n/xb14yhv56fq98c_nqcg8skfc0000gp/T/tempredis1387753332/redis.sock
name: jianghushinian
Get redis key error: redis: nil
====================== stdout ======================
31048:C 02 Jan 2025 00:24:23.933 * Reading config from stdin
31048:C 02 Jan 2025 00:24:23.933 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
31048:C 02 Jan 2025 00:24:23.933 * Redis version=7.2.6, bits=64, commit=00000000, modified=0, pid=31048, just started
31048:C 02 Jan 2025 00:24:23.933 * Configuration loaded
31048:M 02 Jan 2025 00:24:23.933 * monotonic clock: POSIX clock_gettime
31048:M 02 Jan 2025 00:24:23.934 * Running mode=standalone, port=0.
31048:M 02 Jan 2025 00:24:23.934 # WARNING: The TCP backlog setting of 511 cannot be enforced because kern.ipc.somaxconn is set to the lower value of 128.
31048:M 02 Jan 2025 00:24:23.934 * Server initialized
31048:M 02 Jan 2025 00:24:23.934 * Loading RDB produced by version 7.2.6
31048:M 02 Jan 2025 00:24:23.934 * RDB age 167 seconds
31048:M 02 Jan 2025 00:24:23.934 * RDB memory usage when created 1.11 Mb
31048:M 02 Jan 2025 00:24:23.934 * Done loading RDB, keys loaded: 0, keys expired: 0.
31048:M 02 Jan 2025 00:24:23.934 * DB loaded from disk: 0.000 seconds
31048:M 02 Jan 2025 00:24:23.934 * Ready to accept connections unix
31048:signal-handler (1735748664) Received SIGTERM scheduling shutdown...
31048:M 02 Jan 2025 00:24:24.944 * User requested shutdown...
31048:M 02 Jan 2025 00:24:24.944 * Saving the final RDB snapshot before exiting.
31048:M 02 Jan 2025 00:24:24.954 * DB saved on disk
31048:M 02 Jan 2025 00:24:24.954 * Removing the unix socket file.
31048:M 02 Jan 2025 00:24:24.954 # Redis is now ready to exit, bye bye...
====================== stderr ======================
這個(gè)示例很好的演示了 tempredis 的功能和用法,剩下唯一沒有演示的就是 Server.Kill 方法了,你可以自行嘗試下。
總結(jié)
本文介紹了如何使用 tempredis 包來啟動(dòng) Redis 實(shí)例,并應(yīng)用于 Go 項(xiàng)目中??梢园l(fā)現(xiàn),tempredis 包的功能和用法都非常簡(jiǎn)單。
之所以介紹這個(gè)包,其實(shí)是因?yàn)檫@個(gè)包出現(xiàn)在 redsync 項(xiàng)目中,這是一個(gè)用 Go 語言實(shí)現(xiàn)的 Redis 分布式鎖,感興趣的讀者可以自行研究下。
到此這篇關(guān)于使用Go語言啟動(dòng)Redis的實(shí)例詳解的文章就介紹到這了,更多相關(guān)Go啟動(dòng)Redis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang編程入門之http請(qǐng)求天氣實(shí)例
這篇文章主要介紹了golang編程入門之http請(qǐng)求天氣實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
Go interface接口聲明實(shí)現(xiàn)及作用詳解
這篇文章主要為大家介紹了Go interface接口聲明實(shí)現(xiàn)及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Go?json自定義Unmarshal避免判斷nil示例詳解
這篇文章主要為大家介紹了Go?json自定義Unmarshal避免判斷nil示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

