基本介绍

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

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

使用方式

安装:

go get -u github.com/gogf/gf/contrib/nosql/redis/v2

引用:

import (
	_ "github.com/gogf/gf/contrib/nosql/redis/v2"

	// other imported packages.
)

接口文档

简要介绍:

gredis使用了连接池来进行Redis连接管理,通过Config配置对象或者Set*方法可以对连接池的属性进行管理,通过Stats方法可以获取连接池的统计信息。gredis使用接口化的设计来解耦对redis的底层依赖,通过社区组件的方式实现了100+项常用方法,并且提供了分组的方式来管理接口。

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

组件特性

gredis具有以下显著特性:

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

相关文档

Content Menu

  • No labels

15 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功能呢,如果不暴露客户端的话

  9. 使用分片云redis会出错

    panic: got 4 elements in cluster info address, expected 2 or 3

    可能原因:使用的Go-redis客户端版本与Redis版本不匹配,更多信息请参见Go-redis issues

    解决方案:使用对应版本的Go-redis客户端访问Redis实例。

    • Redis 6.0及以下版本:选择Go-redis v8.0及以下版本。
    • Redis 7.0及以上版本:选择Go-redis v9.0及以上版本。
  10. 强哥你好,请问pipeline有计划加入吗?

  11. 踩坑

    github.com/gogf/gf/contrib/nosql/redis/v2 v2.6.3
    github.com/redis/go-redis/v9 v9.5.0  需要redis版本7以上,否则低版本redis会报错

    Redis Client Do failed with arguments "[Set keys value]": ERR Unknown subcommand or wrong number of arguments for 'setinfo'. Try CLIENT HELP

    详见 https://github.com/redis/go-redis/issues/2911

    rdb := redis.NewClient(&redis.Options{
    Addr: "localhost:6380",
    Password: "", // no password set
    DB: 0, // use default DB
    DisableIndentity: true, // redis7版本以下,需要此配置参数
    })

    go get -u github.com/gogf/gf/contrib/nosql/redis/v2 会自动 go: upgraded github.com/redis/go-redis/v9 v9.2.1 => v9.5.0, 就会出现上述问题。
  12. 看源码 redis 组件已经有发布订阅的支持,但是(Redis-使用示例)文档里没有进行完善,我看github已经有不少项目在使用发布订阅了,强哥什么时候完善一下文档呢