Redis客户端由gredis组件实现,底层采用了链接池设计。
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+项常用方法,并且提供了分组的方式来管理接口。
Config
Set*
Stats
redis
100+
gredis.Redis客户端对象提供了一个Close方法,该方法用于关闭Redis客户端(同时关闭客户端的连接池),而不是连接对象,开发者基本不会用到,非高级玩家请不要使用。
gredis.Redis
Close
gredis具有以下显著特性:
OpenTelemetry
可以提供一个方法获取pool吗?方便该包(https://github.com/silenceper/wechat)的redisCache的使用
gredis_redis_conn.go 中调 utils_reflect.go 的
OriginTypeAndKind 时 value.(reflect.Type) 的转换如果 vlaue 会报错。
v2.0的redis怎么设置key的过期时间啊请问。这样报错:
g.Redis().Do(ctx, "EXPIRE", time.Hour)
哥,你的key呢?
key
大多数程序员都喜欢直接使用类似 go-redis 这样友好的api来操作redis,虽然你这种和redis命令行保持一致的操作方式保持了通用性,但实际上使用起来很不方便,我觉的 api 的易用性是很关键的,既然2.0使用了go-redis做为底层的实现库,只要把go-redis的client对象暴露出去给用户使用,至少提供了一种可选的方式,也不破坏gf内部本身的设计。
请问pipline怎么实现?
强哥,亮哥。看下我基于go-redis/v8封装的一个redis工具类。不知道是否能够贡献到goframe框架中,https://github.com/FTLLOVE/redis,写的不好的地方,希望强哥给点建议,希望给goframe尽一些微薄之力 郭强 海亮
很感谢,我看了你的代码,代码整体结构挺不错的。不过这里有几点需要考虑一下,也是我们为什么不直接暴露第三方的go-redis相关类型。
go-redis
redigo
redis.*Cmd
UniversalClient
非常欢迎参与贡献,后续细节我们可以一起再具体聊聊,可以加一下我微信吗?
强哥,我有你的微信,我先改进一下,回头我找您,么么哒
强哥, 就差个mongodb了. 啥时候也整合进来.
怎么使用redis的hook功能呢,如果不暴露客户端的话
使用分片云redis会出错
panic: got 4 elements in cluster info address, expected 2 or 3
可能原因:使用的Go-redis客户端版本与Redis版本不匹配,更多信息请参见Go-redis issues。
解决方案:使用对应版本的Go-redis客户端访问Redis实例。
强哥你好,请问pipeline有计划加入吗?
踩坑
github.com/gogf/gf/contrib/nosql/redis/v2 v2.6.3github.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, 就会出现上述问题。
看源码 redis 组件已经有发布订阅的支持,但是(Redis-使用示例)文档里没有进行完善,我看github已经有不少项目在使用发布订阅了,强哥什么时候完善一下文档呢
15 Comments
智刚
可以提供一个方法获取pool吗?方便该包(https://github.com/silenceper/wechat)的redisCache的使用
FireTiger
gredis_redis_conn.go 中调 utils_reflect.go 的
牛嘿
v2.0的redis怎么设置key的过期时间啊请问。这样报错:
郭强
哥,你的
key
呢?arden
大多数程序员都喜欢直接使用类似 go-redis 这样友好的api来操作redis,虽然你这种和redis命令行保持一致的操作方式保持了通用性,但实际上使用起来很不方便,我觉的 api 的易用性是很关键的,既然2.0使用了go-redis做为底层的实现库,只要把go-redis的client对象暴露出去给用户使用,至少提供了一种可选的方式,也不破坏gf内部本身的设计。
亮亮
请问pipline怎么实现?
豆芽菜
强哥,亮哥。看下我基于go-redis/v8封装的一个redis工具类。不知道是否能够贡献到goframe框架中,https://github.com/FTLLOVE/redis,写的不好的地方,希望强哥给点建议,希望给goframe尽一些微薄之力 郭强 海亮
郭强
很感谢,我看了你的代码,代码整体结构挺不错的。不过这里有几点需要考虑一下,也是我们为什么不直接暴露第三方的
go-redis
相关类型。redigo
,后面切换为了go-redis
,也不能完全保证后续不会再做调整。因此组件需要做一层接口,屏蔽底层实现细节,后续实现不管如何变化,开发者的调用接口不会改变。go-redis
的任何对象类型都应该做屏蔽,不能直接返回给组件的调用者。同时,由于框架已经有非常不错的运行时泛型,可以在适当接口返回该类型(不要返回redis.*Cmd
类型),以便开发者灵活做类型转换。Redis
接口层的结构化输入输出是很有必要的,这块主要是接口封装的工作量。go-redis
有个UniversalClient
挺不错,所以这里可以考虑不用单独判断,以便简化开发者的使用。非常欢迎参与贡献,后续细节我们可以一起再具体聊聊,可以加一下我微信吗?
豆芽菜
强哥,我有你的微信,我先改进一下,回头我找您,么么哒
小陈
强哥, 就差个mongodb了. 啥时候也整合进来.
曾佳
怎么使用redis的hook功能呢,如果不暴露客户端的话
乔焰阳
使用分片云redis会出错
panic: got 4 elements in cluster info address, expected 2 or 3
可能原因:使用的Go-redis客户端版本与Redis版本不匹配,更多信息请参见Go-redis issues。
解决方案:使用对应版本的Go-redis客户端访问Redis实例。
korialuo
强哥你好,请问pipeline有计划加入吗?
chenyu2023
踩坑
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
tianxidev
看源码 redis 组件已经有发布订阅的支持,但是(Redis-使用示例)文档里没有进行完善,我看github已经有不少项目在使用发布订阅了,强哥什么时候完善一下文档呢