RedisGo | 青训营笔记

295 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

  Redis 是 常用的非关系型数据库系统之一,常用于缓存、分布式系统、消息系统等。关于 Redis 的使用可查看Redis 学习笔记

  GoLang 中操作 Redis 的常用工具有redigogo-redis,接下来以 redisgo 为例讲述 Redis 的操作。

  1. 官方文档:godoc.org/github.com/…
  2. 项目地址:github.com/gomodule/re…

文章概要

  • RedisGo 的安装与创建连接
  • 数据操作
  • 事务操作
  • Redis 连接池

详细内容

安装&连接 Redis

  安装 redisgo 模块:

go install github.com/gomodule/redigo/redis@latest

  创建连接:

conn, err := redis.Dial("tcp", "127.0.0.1:6379", redis.DialPassword("123456"))
if err != nil {
    fmt.Println("Connect to redis error", err)
    return
}
defer conn.Close()

数据操作

  使用Do()方法执行 Redis 操作,该方法的参数为操作和参数数组,如:

_, err := conn.Do("set", "name", "猫猫")
do, err := conn.Do("get", "name")

  该方法的第一个返回值为interface{},需要手动转换:

name, _:= redis.String(do, err)
fmt.Println(name)
  1. 上述转换可简化为name, _:= redis.String(conn.Do("get", "name"))
  2. 返回值类型转换方法第二个参数的原理是:若其不为空err != err,则返回nil. err,反之进行后续处理

事务操作

  除了使用Do()操作 Redis,还可以使用Send()Flush()Receive()更灵活地操作。

  Send()将操作写入客户端输出缓冲区;Flush()将输出缓冲区中的操作发往服务端执行;Receive()依次从客户端输入缓冲区取出服务端发送的结果:

conn.Send("get", "name")
conn.Send("get", "age")
conn.Flush()
name, _ := redis.String(conn.Receive())
age, _ := redis.Int(conn.Receive())
fmt.Printf("name: %s, age: %d", name, age)

  Do()结合了上述三个方法,首先将传入操作写入输出缓冲区,然后刷新输出缓冲区,最后获取输出缓冲区最后一个返回值作为方法返回值。

  因此,使用事务的一个例子如下:

conn.Send("MULTI")
conn.Send("set", "name", "Monroe")
conn.Send("set", "age", 30)
conn.Send("incr", "num")
do, err := conn.Do("EXEC")
  1. 输入缓冲区为空时Receive()会导致阻塞

Redis 连接池

  在上述示例中,每次创建一个连接,完成操作后便将其关闭,极大浪费了系统资源。为了提高连接利用率,我们引入连接池来管理与 Redis 的连接,在需要时取出已经存在的未使用连接,实现连接复用。

  创建连接池的方法如下:

pool := &redis.Pool{
    MaxIdle:     5,   // 最大空闲连接数
    MaxActive:   0,   // 最大连接数,0表示无限制
    IdleTimeout: 100, // 最大空闲时间
    Dial: func() (redis.Conn, error) {
        return redis.Dial("tcp", "127.0.0.1:6379")
    },
}

  获取连接使用连接池的Get()方法:

conn := pool.Get()

  关闭连接池使用Close()方法:

pool.Close()
  1. 关闭连接池后获取连接不会返回异常,但在进行后续操作时会产生异常
  2. 从连接池获取的连接应使用Close()方法关闭以归还连接

本文若有不足之处,欢迎纠正(≧^.^≦)喵~
我的其他笔记,可在掘金或 Github( github.com/DoudiNCer/I… )阅读