gredis
采用接口化设计,具有强大的灵活性和扩展性。
https://pkg.go.dev/github.com/gogf/gf/v2/database/gredis#Adapter
// SetAdapter sets custom adapter for current redis client. func (r *Redis) SetAdapter(adapter Adapter) // GetAdapter returns the adapter that is set in current redis client. func (r *Redis) GetAdapter() Adapter |
框架社区组件提供了Redis Adapter
的默认实现,如果开发者需要自实现Redis Adapter
或者想要覆盖其中的某一些方法,可以基于该实现来扩展。
我们来看一个例子,在该例子中,我们实现一个自定义的Redis Adapter
,并且覆盖它的Do
底层方法。为简化示例,我们这里在自实现的Do
方法中打印一条日志即可,后续逻辑仍然走社区Redis Adapter
的实现。
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()) } |
执行后,终端输出:
MyRedis Do: Set [key value] MyRedis Do: Get [key] value |