gredis

Redis客户端由gredis模块实现,底层采用了链接池设计,开发者无法手动Close链接对象。

使用方式:

  1. import "gitee.com/johng/gf/g/database/gredis"

方法列表:godoc.org/github.com/johng-cn/gf/g/database/gredis

  1. func New(address string, db ...interface{}) *Redis
  2. func (r *Redis) Close() error
  3. func (r *Redis) Do(command string, args ...interface{}) (interface{}, error)
  4. func (r *Redis) Send(command string, args ...interface{}) error
  5. func (r *Redis) SetIdleTimeout(value time.Duration)
  6. func (r *Redis) SetMaxActive(value int)
  7. func (r *Redis) SetMaxConnLifetime(value time.Duration)
  8. func (r *Redis) SetMaxIdle(value int)
  9. func (r *Redis) Stats() *PoolStats

gredis使用了连接池来进行Redis对象管理,通过Set*方法可以对连接池的属性进行管理,通过Stats方法可以获取连接池的统计信息。我们最常用的方法是DoSend方法,分别是同步和异步指令,通过向Redis Server发送对应的Redis API命令,来使用Redis Server的服务。

需要注意的是,Close方法是关闭链接池,而不是关闭当前的redis操作链接,只有在开发者期望自行维护gredis对象的时候才可能涉及到Close方法的使用。绝大部分情况下推荐使用g.Redis单例方式来操作redis。

以下是一个简单的使用gredis的示例:

  1. package main
  2. import (
  3. "fmt"
  4. "gitee.com/johng/gf/g/util/gconv"
  5. "gitee.com/johng/gf/g/database/gredis"
  6. )
  7. // 使用原生gredis.New操作redis,但是注意需要自己调用Close方法关闭redis链接池
  8. func main() {
  9. redis := gredis.New(gredis.Config{
  10. Host : "127.0.0.1",
  11. Port : 6379,
  12. })
  13. defer redis.Close()
  14. redis.Do("SET", "k", "v")
  15. v, _ := redis.Do("GET", "k")
  16. fmt.Println(gconv.String(v))
  17. }

该示例中,我们通过New方法创建一个Redis操作对象,并通过Do方法使用Redis Server的KV功能,随后我们再获取设置的信息。由于Do接口返回的都是interface{}类型的返回值,我们这里通过gconv模块将任何类型转换为string来进行显示。
执行后输出结果为:

  1. v

全局配置

推荐使用g.Redis的方式来获取单例的gredis对象,并且由于gredis底层采用链接池的方式来管理客户端链接,因此开发者无须手动调用Close方式关闭链接对象(并且gredis没有提供关闭链接对象的Close方法,仅有直接关闭链接池Close方法,绝大部分情况下开发者无须关系底层redis链接池的状态维护)。

当然,像Redis这么常用的服务,也已经被对象管理器(g.*)进行了封装,其配置也可以通过配置文件进行管理,在config.toml中的配置示例如下:

  1. # Redis数据库配置
  2. [redis]
  3. default = "127.0.0.1:6379,0"
  4. cache = "127.0.0.1:6379,1"

其中示例中的diskcache分别表示配置分组名称,我们在程序中可以通过该名称获取对应配置的redis对象。redis配置项格式为:host:port[,db[,pass]](即:地址:端口[,数据库DB[,密码]]),其中db(默认为0)及pass(默认为空)配置字段为非必须。随后我们可以通过g.Redis("分组名称")(不传递分组名称是,默认使用redis.default配置分组项)来获取对应配置的redis客户端单例对象。

示例如下:

  1. package main
  2. import (
  3. "fmt"
  4. "gitee.com/johng/gf/g"
  5. "gitee.com/johng/gf/g/util/gconv"
  6. )
  7. // 使用框架封装的g.Redis()方法获得redis操作对象单例,不需要开发者显示调用Close方法
  8. func main() {
  9. g.Redis().Do("SET", "k", "v")
  10. v, _ := g.Redis().Do("GET", "k")
  11. fmt.Println(gconv.String(v))
  12. }

执行后,输出结果为:

  1. v