当前位置: 代码网 > it编程>前端脚本>Golang > 使用Go语言启动Redis的实例详解

使用Go语言启动Redis的实例详解

2025年02月13日 Golang 我要评论
最近写了几篇 go 并发编程相关的文章,想必有些读者看多了可能会有些厌倦,今天来点轻松的内容,介绍一个可以用来启动 redis-server 的开源库 github.com/stvp/tempredi

最近写了几篇 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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com