使用Go語言啟動Redis的實例詳解
最近寫了幾篇 Go 并發(fā)編程相關(guān)的文章,想必有些讀者看多了可能會有些厭倦,今天來點輕松的內(nèi)容,介紹一個可以用來啟動 redis-server
的開源庫 github.com/stvp/tempredis
。這是一個用 Go 語言開發(fā)的包,專門用于創(chuàng)建臨時的 Redis 實例,主要用于測試目的。它可以在本地啟動一個臨時的 Redis 服務(wù)實例,在測試結(jié)束后自動關(guān)閉并清理,幫助開發(fā)者避免對實際的 Redis 環(huán)境進行操作。
主要功能
tempredis
包主要功能如下:
- 快速啟動臨時 Redis 實例:無需手動安裝和配置 Redis,只要系統(tǒng)上已經(jīng)安裝了 Redis 二進制文件(
redis-server
)。 - 獨立的測試環(huán)境:每個測試運行一個獨立的 Redis 實例,避免了測試之間的相互干擾。
- 自動清理:測試完成后,臨時實例會被關(guān)閉,相關(guān)文件會被刪除。
環(huán)境準備
首先,主機上當然要安裝 Redis 二進制文件和安裝 tempredis
Go 包:
# mac 電腦直接使用 brew 即可安裝 redis-server # 其他平臺可以參考官方文檔:https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/ $ brew install redis # 安裝 tempredis Go 包 $ go get -u github.com/stvp/tempredis
簡單介紹
可以在 tempredis 文檔 中看到其實現(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)體實際上就是一個 map[string]string
對象,用于設(shè)置 Redis 配置。它的 Socket
方法用于返回 redis.sock
文件位置。
Server
結(jié)構(gòu)體代表一個 Redis 實例對象,幾個方法作用分別如下:
Start
是一個函數(shù),用于根據(jù)給定的配置Config
啟動Server
。Kill
方法用于強制關(guān)閉redis-server
。Term
方法用于優(yōu)雅關(guān)閉redis-server
。Socket
方法會代理到Config.Socket
方法調(diào)用。Stdout
方法阻塞等待返回redis-server
執(zhí)行后的標準輸出。Stderr
方法阻塞等待返回redis-server
執(zhí)行后的錯誤輸出。
使用示例
我們已經(jīng)對 tempredis
提供的方法有了初步的了解,那么是時候?qū)懸粋€小 demo 練練手了,示例代碼如下:
package main import ( "fmt" "log" "time" "github.com/go-redis/redis" "github.com/stvp/tempredis" ) func main() { // 創(chuàng)建并啟動一個臨時的 Redis 實例 server, err := tempredis.Start(tempredis.Config{ "port": "0", // 自動分配端口 }) 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 退出時關(guān)閉 redis-server defer server.Term() // 獲取 Redis 的地址 fmt.Println("Redis server is running at", server.Socket()) // 連接臨時的 Redis 實例 client := redis.NewClient(&redis.Options{ Network: "unix", Addr: server.Socket(), }) // 使用 Redis 實例 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) }
代碼中每個部分我都寫了注釋說明,不難理解。在啟動臨時的 Redis 實例后,可以使用任何 Go Redis 客戶端進行連接,這里使用的是 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 ======================
這個示例很好的演示了 tempredis
的功能和用法,剩下唯一沒有演示的就是 Server.Kill
方法了,你可以自行嘗試下。
總結(jié)
本文介紹了如何使用 tempredis
包來啟動 Redis 實例,并應(yīng)用于 Go 項目中??梢园l(fā)現(xiàn),tempredis
包的功能和用法都非常簡單。
之所以介紹這個包,其實是因為這個包出現(xiàn)在 redsync 項目中,這是一個用 Go 語言實現(xiàn)的 Redis 分布式鎖,感興趣的讀者可以自行研究下。
到此這篇關(guān)于使用Go語言啟動Redis的實例詳解的文章就介紹到這了,更多相關(guān)Go啟動Redis內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go實現(xiàn)一個輕量級并發(fā)任務(wù)調(diào)度器(支持限速)
本文主要介紹了Go實現(xiàn)一個輕量級并發(fā)任務(wù)調(diào)度器(支持限速),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2025-04-04Go語言同步與異步執(zhí)行多個任務(wù)封裝詳解(Runner和RunnerAsync)
這篇文章主要給大家介紹了關(guān)于Go語言同步與異步執(zhí)行多個任務(wù)封裝(Runner和RunnerAsync)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧。2018-01-01Fedora14 Linux系統(tǒng)安裝Golang開發(fā)環(huán)境筆記
這篇文章主要介紹了Fedora14 Linux系統(tǒng)安裝Golang開發(fā)環(huán)境筆記,本文講解了2種安裝方法,需要的朋友可以參考下2014-10-10