环境准备
本文假设读者电脑上已经安装好了Docker和Golang,并且有自己的Go语言编辑器,例如:Goland。
使用Docker在本地启动一个Redis服务
参考如下命令
docker run -d --name my-redis -p 6379:6379 redis --requirepass 123456
注:上面命令会启动一个Redis服务,并带有访问密码,因此在操作Redis是,需要先认证。
开始编码
建立Redis连接
import (
"fmt"
"github.com/gomodule/redigo/redis"
"time"
)
const (
serverIp = "127.0.0.1"
serverPort = 6379
requirePass = "123456"
)
// 全局连接池对象
var pool *redis.Pool
func init() {
pool = getPool()
}
func getConn() (redis.Conn, error) {
// 创建链接
conn, err := redis.Dial("tcp", fmt.Sprintf("%s:%d", serverIp, serverPort))
if err != nil {
return nil, err
}
// 认证
if _, err = conn.Do("auth", requirePass); err != nil {
return nil, err
}
return conn, nil
}
func getPool() *redis.Pool {
return &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240,
Dial: getConn,
TestOnBorrow: func(c redis.Conn, t time.Time) error {
if time.Since(t) < time.Minute {
return nil
}
_, err := c.Do("PING")
return err
},
}
}
代码解释:
- 创建全局连接池对象
var pool *redis.Pool
- 封装建立Redis连接的方法
func getConn() (redis.Conn, error)
- 封装获取连接池的方法
func getPool() *redis.Pool
- 并在init方法中对pool进行初始化
封装Redis结构并绑定方法
推荐每个Redis命令对应一个Redis结构的方法,此示例当中封装了三个方法:
GetString()
SetString()
Exists()
分别对应了Redis原生的三个命令: get、set、exists。
代码示例如下:
import "github.com/gomodule/redigo/redis"
type Redis struct {
conn redis.Conn
}
func NewRedis() *Redis {
return &Redis{
conn: pool.Get(),
}
}
func (r *Redis) GetString(key string) (interface{}, error) {
rsp, err := r.conn.Do("get", key)
if err != nil {
return nil, err
}
return rsp, nil
}
func (r *Redis) SetString(key, value string) (interface{}, error) {
rsp, err := r.conn.Do("set", key, value)
if err != nil {
return nil, err
}
return rsp, nil
}
func (r *Redis) Exists(keys ...interface{}) (int64, error) {
num, err := r.conn.Do("exists", keys...)
if err != nil {
return 0, err
}
return num.(int64), nil
}
func (r *Redis) Close() {
_ = r.conn.Close()
}
使用封装的方法对Redis进行操作
代码示例
import (
"fmt"
"golang_cloud_native_0voice/internal/redigopkg"
"os"
)
func main() {
redisOp := redigopkg.NewRedis()
_, err := redisOp.SetString("name", "xiaoli")
if err != nil {
fmt.Printf("set string error: %s\n", err.Error())
os.Exit(-1)
}
fmt.Println("=> set string success!")
num, err := redisOp.Exists("name")
if err != nil {
fmt.Printf("exist error: %s\n", err.Error())
os.Exit(-1)
}
fmt.Printf("=> exists key num: %d\n", num)
result, err := redisOp.GetString("name")
if err != nil {
fmt.Printf("get string error: %s\n", err.Error())
os.Exit(-1)
}
fmt.Printf("=> the value of name: %s\n", string(result.([]byte)))
redisOp.Close()
}
运行结果
总结
本文示例使用的是redigo开源库对Redis进行操作,其实使用的更多的还有一个库,那就是go-redis,此库对Redis的操作封装的更为丰富,感兴趣的读者可以自行学习。
技术参考
github.com/gomodule/redigo/redis
本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对Go云原生课程感兴趣的读者,可以点击链接,详细查看详细的服务: https://ke.qq.com/course/422970?flowToken=1043281#term_id=100504894