# README

Redis client for Go

go-redis 对外提供了 Hook 机制,用于挂载 Middleware 扩展额外的请求响应逻辑。

type Hook interface {
	DialHook(next DialHook) DialHook
	ProcessHook(next ProcessHook) ProcessHook
	ProcessPipelineHook(next ProcessPipelineHook) ProcessPipelineHook
}

type (
	DialHook			func(ctx context.Context, network, addr string) (net.Conn, error)
	ProcessHook		 func(ctx context.Context, cmd Cmder) error
	ProcessPipelineHook func(ctx context.Context, cmds []Cmder) error
)

Client 在 Init 时会初始化基础的 Hook,用户可以通过 AddHook 方法填加自定义的 Hook:

func (c *Client) init() {
	c.cmdable = c.Process
	c.initHooks(hooks{
		dial:		c.baseClient.dial,
		process:	c.baseClient.process,
		pipeline:	c.baseClient.processPipeline,
		txPipeline:	c.baseClient.processTxPipeline,
	})
}

func (hs *hooksMixin) AddHook(hook Hook) {
	hs.slice = append(hs.slice, hook)
	hs.chain()
}

go-contrib 中实现了 Hook Interface,通过以下代码可以在 Client 初始化后添加:

package main

import (
	"github.com/go-redis/redis/v9"

	metrics "github.com/quwan-sre/observability-go-contrib/metrics/go-redis"
)

func main() {

	redisClient = redis.NewUniversalClient(&redis.UniversalOptions{
		Addrs: []string{"127.0.0.1:6379"},
	})

	// 填加 Hook
	redisClient.AddHook(metrics.NewRedisHook([]string{"127.0.0.1:6379"}))
	return
}

由于 Hook 方法执行时想要获取 Redis Server 的信息困难,因此在 NewRedisHook 方法中需要提供连接 IP:Port,这些信息将直接用于填充指标的 Label。

# Functions

No description provided by the author