Skip to end of metadata
Go to start of metadata

基本介绍

Redis客户端由gredis组件实现,底层采用了链接池设计。

为了保证通用性和扩展性,gredis组件采用了命令通道的方式执行Redis操作。当您不知道命令通道的参数如何传递时,可以参考终端命令行的参数传递。也就是说,所有的操作都和命令行的参数传递保持一致。

使用方式

import "github.com/gogf/gf/v2/database/gredis"

接口文档

https://pkg.go.dev/github.com/gogf/gf/v2/database/gredis

简要介绍:

gredis使用了连接池来进行Redis连接管理,通过Config配置对象或者Set*方法可以对连接池的属性进行管理,通过Stats方法可以获取连接池的统计信息。我们最常用的是Do方法,执行同步指令,通过向Redis Server发送对应的Redis API命令,来使用Redis Server的服务。Do方法最大的特点是内部自行从连接池中获取连接对象,使用完毕后自动丢回连接池中,开发者无需手动调用Close方法,方便使用。

gredis.Redis客户端对象提供了一个Close方法,该方法用于关闭Redis客户端(同时关闭客户端的连接池),而不是连接对象,开发者基本不会用到,非高级玩家请不要使用。

组件特性

gredis具有以下显著特性:

  • 使用简便,功能强大
  • 统一配置组件进行配置
  • 支持单实例及集群化操作
  • 支持Redis服务所有特性
  • 支持OpenTelemetry可观测性
  • 支持单例对象、也支持动态创建对象
  • 接口化设计,很高的灵活性和扩展性

相关文档

Content Menu

  • No labels

11 Comments

  1. 可以提供一个方法获取pool吗?方便该包(https://github.com/silenceper/wechat)的redisCache的使用 

  2. gredis_redis_conn.go 中调 utils_reflect.go 的 

    OriginTypeAndKind 时 value.(reflect.Type) 的转换
    如果 vlaue 会报错。


  3. v2.0的redis怎么设置key的过期时间啊请问。这样报错:

    g.Redis().Do(ctx, "EXPIRE", time.Hour)

    1. 哥,你的key呢?

  4. 为了保证通用性和扩展性,gredis组件采用了命令通道的方式执行Redis操作。当您不知道命令通道的参数如何传递时,可以参考终端命令行的参数传递。也就是说,所有的操作都和命令行的参数传递保持一致。

    大多数程序员都喜欢直接使用类似 go-redis 这样友好的api来操作redis,虽然你这种和redis命令行保持一致的操作方式保持了通用性,但实际上使用起来很不方便,我觉的 api 的易用性是很关键的,既然2.0使用了go-redis做为底层的实现库,只要把go-redis的client对象暴露出去给用户使用,至少提供了一种可选的方式,也不破坏gf内部本身的设计。

  5. 请问pipline怎么实现?

  6. 强哥,亮哥。看下我基于go-redis/v8封装的一个redis工具类。不知道是否能够贡献到goframe框架中,https://github.com/FTLLOVE/redis,写的不好的地方,希望强哥给点建议,希望给goframe尽一些微薄之力 郭强 海亮 

    1. 很感谢,我看了你的代码,代码整体结构挺不错的。不过这里有几点需要考虑一下,也是我们为什么不直接暴露第三方的go-redis相关类型。

      • 之前我们用的redigo,后面切换为了go-redis,也不能完全保证后续不会再做调整。因此组件需要做一层接口,屏蔽底层实现细节,后续实现不管如何变化,开发者的调用接口不会改变。
      • 第三方go-redis的任何对象类型都应该做屏蔽,不能直接返回给组件的调用者。同时,由于框架已经有非常不错的运行时泛型,可以在适当接口返回该类型(不要返回redis.*Cmd类型),以便开发者灵活做类型转换。
      • 你的接口定义不错,经过长期的社区反馈来看,Redis接口层的结构化输入输出是很有必要的,这块主要是接口封装的工作量。
      • 此外,go-redis有个UniversalClient挺不错,所以这里可以考虑不用单独判断,以便简化开发者的使用。

      非常欢迎参与贡献,后续细节我们可以一起再具体聊聊,可以加一下我微信吗?

      1. 强哥,我有你的微信,我先改进一下,回头我找您,么么哒

  7. 强哥, 就差个mongodb了.  啥时候也整合进来. 

  8. 怎么使用redis的hook功能呢,如果不暴露客户端的话