最近写了几篇 go 并发编程相关的文章,想必有些读者看多了可能会有些厌倦,今天来点轻松的内容,介绍一个可以用来启动 redis-server 的开源库 github.com/stvp/tempredis。这是一个用 go 语言开发的包,专门用于创建临时的 redis 实例,主要用于测试目的。它可以在本地启动一个临时的 redis 服务实例,在测试结束后自动关闭并清理,帮助开发者避免对实际的 redis 环境进行操作。
主要功能
tempredis 包主要功能如下:
- 快速启动临时 redis 实例:无需手动安装和配置 redis,只要系统上已经安装了 redis 二进制文件(
redis-server)。 - 独立的测试环境:每个测试运行一个独立的 redis 实例,避免了测试之间的相互干扰。
- 自动清理:测试完成后,临时实例会被关闭,相关文件会被删除。
环境准备
首先,主机上当然要安装 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 文档 中看到其实现的 exported 结构体和方法:
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 结构体实际上就是一个 map[string]string 对象,用于设置 redis 配置。它的 socket 方法用于返回 redis.sock 文件位置。
server 结构体代表一个 redis 实例对象,几个方法作用分别如下:
start是一个函数,用于根据给定的配置config启动server。kill方法用于强制关闭redis-server。term方法用于优雅关闭redis-server。socket方法会代理到config.socket方法调用。stdout方法阻塞等待返回redis-server执行后的标准输出。stderr方法阻塞等待返回redis-server执行后的错误输出。
使用示例
我们已经对 tempredis 提供的方法有了初步的了解,那么是时候写一个小 demo 练练手了,示例代码如下:
package main
import (
"fmt"
"log"
"time"
"github.com/go-redis/redis"
"github.com/stvp/tempredis"
)
func main() {
// 创建并启动一个临时的 redis 实例
server, err := tempredis.start(tempredis.config{
"port": "0", // 自动分配端口
})
if err != nil {
log.fatalf("failed to start tempredis: %v", err)
}
// 放在 defer 中执行,避免阻塞 main goroutine
defer func() {
fmt.println("====================== stdout ======================")
fmt.println(server.stdout())
fmt.println("====================== stderr ======================")
fmt.println(server.stderr())
}()
// main 退出时关闭 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 已经过期
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 的功能了。
执行示例代码,得到输出如下:
$ 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 方法了,你可以自行尝试下。
总结
本文介绍了如何使用 tempredis 包来启动 redis 实例,并应用于 go 项目中。可以发现,tempredis 包的功能和用法都非常简单。
之所以介绍这个包,其实是因为这个包出现在 redsync 项目中,这是一个用 go 语言实现的 redis 分布式锁,感兴趣的读者可以自行研究下。
到此这篇关于使用go语言启动redis的实例详解的文章就介绍到这了,更多相关go启动redis内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论