gredis 采用接口化设计,具有强大的灵活性和扩展性。

接口定义

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

相关方法

  1. // SetAdapter sets custom adapter for current redis client.
  2. func (r *Redis) SetAdapter(adapter Adapter)
  3. // GetAdapter returns the adapter that is set in current redis client.
  4. func (r *Redis) GetAdapter() Adapter

自实现Redis Adapter

框架社区组件提供了 Redis Adapter 的默认实现,如果开发者需要自实现 Redis Adapter 或者想要覆盖其中的某一些方法,可以基于该实现来扩展。

我们来看一个例子,在该例子中,我们实现一个自定义的 Redis Adapter,并且覆盖它的 Do 底层方法。为简化示例,我们这里在自实现的 Do 方法中打印一条日志即可,后续逻辑仍然走社区 Redis Adapter 的实现。

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/contrib/nosql/redis/v2"
  6. "github.com/gogf/gf/v2/container/gvar"
  7. "github.com/gogf/gf/v2/database/gredis"
  8. "github.com/gogf/gf/v2/frame/g"
  9. "github.com/gogf/gf/v2/os/gctx"
  10. )
  11. var (
  12. ctx = gctx.New()
  13. group = "cache"
  14. config = gredis.Config{
  15. Address: "127.0.0.1:6379",
  16. Db: 1,
  17. }
  18. )
  19. // MyRedis description
  20. type MyRedis struct {
  21. *redis.Redis
  22. }
  23. // Do implements and overwrites the underlying function Do from Adapter.
  24. func (r *MyRedis) Do(ctx context.Context, command string, args ...interface{}) (*gvar.Var, error) {
  25. fmt.Println("MyRedis Do:", command, args)
  26. return r.Redis.Do(ctx, command, args...)
  27. }
  28. func main() {
  29. gredis.RegisterAdapterFunc(func(config *gredis.Config) gredis.Adapter {
  30. r := &MyRedis{redis.New(config)}
  31. r.AdapterOperation = r // This is necessary.
  32. return r
  33. })
  34. gredis.SetConfig(&config, group)
  35. _, err := g.Redis(group).Set(ctx, "key", "value")
  36. if err != nil {
  37. g.Log().Fatal(ctx, err)
  38. }
  39. value, err := g.Redis(group).Get(ctx, "key")
  40. if err != nil {
  41. g.Log().Fatal(ctx, err)
  42. }
  43. fmt.Println(value.String())
  44. }

执行后,终端输出:

  1. MyRedis Do: Set [key value]
  2. MyRedis Do: Get [key]
  3. value