package main
import (
"context"
"fmt"
"github.com/gogf/gf/contrib/nosql/redis/v2"
"github.com/gogf/gf/v2/container/gvar"
"github.com/gogf/gf/v2/database/gredis"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
var (
ctx = gctx.New()
group = "cache"
config = gredis.Config{
Address: "127.0.0.1:6379",
Db: 1,
}
)
// MyRedis description
type MyRedis struct {
*redis.Redis
}
// Do implements and overwrites the underlying function Do from Adapter.
func (r *MyRedis) Do(ctx context.Context, command string, args ...interface{}) (*gvar.Var, error) {
fmt.Println("MyRedis Do:", command, args)
return r.Redis.Do(ctx, command, args...)
}
func main() {
gredis.RegisterAdapterFunc(func(config *gredis.Config) gredis.Adapter {
r := &MyRedis{redis.New(config)}
r.AdapterOperation = r // This is necessary.
return r
})
gredis.SetConfig(&config, group)
_, err := g.Redis(group).Set(ctx, "key", "value")
if err != nil {
g.Log().Fatal(ctx, err)
}
value, err := g.Redis(group).Get(ctx, "key")
if err != nil {
g.Log().Fatal(ctx, err)
}
fmt.Println(value.String())
}
3 Comments
曾佳
问题:现在我需要给Redis操作进行打点,切入日志、Prometheus业务指标采集。看完文档与源码,在gredis层面只能通过自定义Adapter,在创建redis client的时候添加Hook实现,除了这种还有其他方式吗?
郭强
可以参考数据库ORM的
Driver
实现,"继承"新版本的社区组件Adapter
实现,自己覆盖底层的Do
方法打点即可,不过可能需要改进下社区组件内部实现把接口对象传递进去(目前内部调用的Do
没法覆盖)。overbeck.jack
我应该如何获取底层的 go-redis 实例?我看了下源码似乎没找到获取的方式,请问如何能实现? 郭强