From 62e897190d7e0445bbd6fc88d61f16a413ab6042 Mon Sep 17 00:00:00 2001 From: douxu Date: Wed, 15 Oct 2025 17:08:32 +0800 Subject: [PATCH] optimize code of measurement recommend and logger output --- constants/redis.go | 7 ++++++ constants/trace.go | 9 ++++++++ go.mod | 4 ++-- go.sum | 19 ++++------------ logger/logger.go | 4 +++- main.go | 5 +++++ middleware/trace.go | 21 +++++++++++------- model/redis_recommend.go | 36 ++++++++++++++++++++---------- router/measurement.go | 2 +- util/redis_init.go | 47 ++++++++++++++++++++++++++++++++++++++++ 10 files changed, 116 insertions(+), 38 deletions(-) create mode 100644 constants/redis.go create mode 100644 constants/trace.go diff --git a/constants/redis.go b/constants/redis.go new file mode 100644 index 0000000..3ddbcef --- /dev/null +++ b/constants/redis.go @@ -0,0 +1,7 @@ +// Package constants define constant variable +package constants + +const ( + // RedisSearchDictName define redis search dictionary name + RedisSearchDictName = "search_suggestions_dict" +) diff --git a/constants/trace.go b/constants/trace.go new file mode 100644 index 0000000..14f52ed --- /dev/null +++ b/constants/trace.go @@ -0,0 +1,9 @@ +// Package constants define constant variable +package constants + +// Assuming the B3 specification +const ( + HeaderTraceID = "X-B3-TraceId" + HeaderSpanID = "X-B3-SpanId" + HeaderParentSpanID = "X-B3-ParentSpanId" +) diff --git a/go.mod b/go.mod index 68cf3d4..62286ba 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,12 @@ go 1.24.1 require ( github.com/DATA-DOG/go-sqlmock v1.5.2 - github.com/RediSearch/redisearch-go v1.1.1 + github.com/RediSearch/redisearch-go/v2 v2.1.1 github.com/bitly/go-simplejson v0.5.1 github.com/confluentinc/confluent-kafka-go v1.9.2 github.com/gin-gonic/gin v1.10.0 github.com/gofrs/uuid v4.4.0+incompatible + github.com/gomodule/redigo v1.8.9 github.com/gorilla/websocket v1.5.3 github.com/json-iterator/go v1.1.12 github.com/natefinch/lumberjack v2.0.0+incompatible @@ -48,7 +49,6 @@ require ( github.com/go-playground/validator/v10 v10.23.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/goccy/go-json v0.10.3 // indirect - github.com/gomodule/redigo v1.8.3 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect diff --git a/go.sum b/go.sum index dcb3ad2..e4e6037 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,8 @@ github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7Oputl github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= -github.com/RediSearch/redisearch-go v1.1.1 h1:YElqguUO9lSqCYszrQcoTUoB9zBRyb2gkO4+yh3STMo= -github.com/RediSearch/redisearch-go v1.1.1/go.mod h1:vcSdla+ZmI3B9doZbLoUrwNJfuvJzRt+/FoE38JcMS8= +github.com/RediSearch/redisearch-go/v2 v2.1.1 h1:cCn3i40uLsVD8cxwrdrGfhdAgbR5Cld9q11eYyVOwpM= +github.com/RediSearch/redisearch-go/v2 v2.1.1/go.mod h1:Uw93Wi97QqAsw1DwbQrhVd88dBorGTfSuCS42zfh1iA= github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu1fXES56uXniYFv4yDA= github.com/actgardner/gogen-avro/v10 v10.2.1/go.mod h1:QUhjeHPchheYmMDni/Nx7VB0RsT/ee8YIgGY/xpEQgQ= github.com/actgardner/gogen-avro/v9 v9.1.0/go.mod h1:nyTj6wPqDJoxM3qdnjcLv+EnMDSDFqE0qDpva2QRmKc= @@ -115,8 +115,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.8.3 h1:HR0kYDX2RJZvAup8CsiJwxB4dTCSC0AaUq6S4SiLwUc= -github.com/gomodule/redigo v1.8.3/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= +github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= +github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -241,7 +241,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -262,8 +261,6 @@ github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2 github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -287,8 +284,6 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= @@ -306,7 +301,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= @@ -318,7 +312,6 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= @@ -332,8 +325,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210421221651-33663a62ff08/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -350,7 +341,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= @@ -362,7 +352,6 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= diff --git a/logger/logger.go b/logger/logger.go index eb97838..116e3b1 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -6,6 +6,8 @@ import ( "path" "runtime" + "modelRT/constants" + "go.uber.org/zap" "go.uber.org/zap/zapcore" ) @@ -46,7 +48,7 @@ func makeLogFields(ctx context.Context, kv ...any) []zap.Field { kv = append(kv, "unknown") } - kv = append(kv, "traceID", ctx.Value("traceID"), "spanID", ctx.Value("spanID"), "pspanID", ctx.Value("pspanID")) + kv = append(kv, "traceID", ctx.Value(constants.HeaderTraceID), "spanID", ctx.Value(constants.HeaderSpanID), "parentSpanID", ctx.Value(constants.HeaderParentSpanID)) funcName, file, line := getLoggerCallerInfo() kv = append(kv, "func", funcName, "file", file, "line", line) diff --git a/main.go b/main.go index d0ae3b0..d3e161d 100644 --- a/main.go +++ b/main.go @@ -19,6 +19,7 @@ import ( "modelRT/handler" "modelRT/logger" "modelRT/middleware" + "modelRT/model" "modelRT/pool" "modelRT/router" "modelRT/util" @@ -94,6 +95,10 @@ func main() { } defer parsePool.Release() + searchPool, err := util.NewRedigoPool(modelRTConfig.StorageRedisConfig) + defer searchPool.Close() + model.InitAutocompleterWithPool(searchPool) + storageClient := diagram.InitRedisClientInstance(modelRTConfig.StorageRedisConfig) defer storageClient.Close() diff --git a/middleware/trace.go b/middleware/trace.go index ef2dad9..1bb27ca 100644 --- a/middleware/trace.go +++ b/middleware/trace.go @@ -6,6 +6,7 @@ import ( "strings" "time" + "modelRT/constants" "modelRT/logger" "modelRT/util" @@ -15,15 +16,17 @@ import ( // StartTrace define func of set trace info from request header func StartTrace() gin.HandlerFunc { return func(c *gin.Context) { - traceID := c.Request.Header.Get("traceid") - pSpanID := c.Request.Header.Get("spanid") + traceID := c.Request.Header.Get(constants.HeaderTraceID) + parentSpanID := c.Request.Header.Get(constants.HeaderSpanID) spanID := util.GenerateSpanID(c.Request.RemoteAddr) - if traceID == "" { // 如果traceId 为空,证明是链路的发端,把它设置成此次的spanId,发端的spanId是root spanId - traceID = spanID // trace 标识整个请求的链路, span则标识链路中的不同服务 + // if traceId is empty, it means it is the origin of the link. Set it to the spanId of this time. The originating spanId is the root spanId. + if traceID == "" { + // traceId identifies the entire request link, and spanId identifies the different services in the link. + traceID = spanID } - c.Set("traceid", traceID) - c.Set("spanid", spanID) - c.Set("pspanid", pSpanID) + c.Set(constants.HeaderTraceID, traceID) + c.Set(constants.HeaderSpanID, spanID) + c.Set(constants.HeaderParentSpanID, parentSpanID) c.Next() } } @@ -33,7 +36,7 @@ type bodyLogWriter struct { body *bytes.Buffer } -// 包装一下 gin.ResponseWriter,通过这种方式拦截写响应 +// TODO 包装一下 gin.ResponseWriter,通过这种方式拦截写响应 // 让gin写响应的时候先写到 bodyLogWriter 再写gin.ResponseWriter , // 这样利用中间件里输出访问日志时就能拿到响应了 // https://stackoverflow.com/questions/38501325/how-to-log-response-body-in-gin @@ -42,6 +45,8 @@ func (w bodyLogWriter) Write(b []byte) (int, error) { return w.ResponseWriter.Write(b) } +// TODO 用于访问request与reponse的日志记录 +// LogAccess define func of log access info func LogAccess() gin.HandlerFunc { return func(c *gin.Context) { // 保存body diff --git a/model/redis_recommend.go b/model/redis_recommend.go index d42cbd8..6e090cd 100644 --- a/model/redis_recommend.go +++ b/model/redis_recommend.go @@ -4,15 +4,24 @@ package model import ( "context" "fmt" + "math" "strings" "modelRT/constants" "modelRT/diagram" "modelRT/logger" - "github.com/RediSearch/redisearch-go/redisearch" + "github.com/RediSearch/redisearch-go/v2/redisearch" + redigo "github.com/gomodule/redigo/redis" ) +var ac *redisearch.Autocompleter + +// InitAutocompleterWithPool define func of initialize the Autocompleter with redigo pool +func InitAutocompleterWithPool(pool *redigo.Pool) { + ac = redisearch.NewAutocompleterFromPool(pool, constants.RedisSearchDictName) +} + // RedisSearchRecommend define func of redis search by input string and return recommend results func RedisSearchRecommend(ctx context.Context, input string) ([]string, error) { rdb := diagram.GetRedisClientInstance() @@ -32,22 +41,29 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, error) { logger.Error(ctx, "check grid key exist failed ", "grid_key", input, "error", err) return []string{}, err } - + // TODO delete debug info + fmt.Println("gridExist", gridExist) if !gridExist { - // TODO 检测name是不是 tire 树名 - ac := redisearch.NewAutocompleter("localhost:6379", "my-autocomplete-dict") results, err := ac.SuggestOpts(input, redisearch.SuggestOptions{ // TODO 测试如何返回全部的可能模糊结果 - Num: 5, + Num: math.MaxInt16, Fuzzy: true, - WithScores: true, - WithPayloads: true, + WithScores: false, + WithPayloads: false, }) + // TODO delete debug info + fmt.Printf("results:%+v\n", results) + fmt.Println("err", err) if err != nil { logger.Error(ctx, "query info by fuzzy failed", "query_key", input, "error", err) return []string{}, err } + if len(results) == 0 { + // TODO 构建 for 循环返回所有可能的补全 + // continue + } + var grids []string for _, result := range results { grids = append(grids, result.Term) @@ -91,12 +107,10 @@ func RedisSearchRecommend(ctx context.Context, input string) ([]string, error) { } if !exist { - fmt.Println("use fuzzy query") - // TODO 检测name是不是 tire 树名 - ac := redisearch.NewAutocompleter("localhost:6379", "my-autocomplete-dict") + logger.Info(ctx, "use fuzzy query", "input", input) results, err := ac.SuggestOpts(input, redisearch.SuggestOptions{ // TODO 测试如何返回全部的可能模糊结果 - Num: 5, + Num: math.MaxInt16, Fuzzy: true, WithScores: true, WithPayloads: true, diff --git a/router/measurement.go b/router/measurement.go index 19799e1..276b351 100644 --- a/router/measurement.go +++ b/router/measurement.go @@ -11,7 +11,7 @@ import ( // registerMeasurementRoutes define func of register measurement routes func registerMeasurementRoutes(rg *gin.RouterGroup, clientToken string) { g := rg.Group("/measurement/") - rg.Use(middleware.SetTokenMiddleware(clientToken)) + g.Use(middleware.SetTokenMiddleware(clientToken)) g.GET("load", handler.MeasurementGetHandler) g.GET("recommend", handler.MeasurementRecommendHandler) } diff --git a/util/redis_init.go b/util/redis_init.go index bd2d107..8ea504a 100644 --- a/util/redis_init.go +++ b/util/redis_init.go @@ -4,7 +4,11 @@ package util import ( "context" "fmt" + "time" + "modelRT/config" + + redigo "github.com/gomodule/redigo/redis" "github.com/redis/go-redis/v9" ) @@ -35,3 +39,46 @@ func NewRedisClient(addr string, opts ...RedisOption) (*redis.Client, error) { } return client, nil } + +// NewRedigoPool define func of initialize the Redigo pool +func NewRedigoPool(rCfg config.RedisConfig) (*redigo.Pool, error) { + pool := &redigo.Pool{ + MaxIdle: rCfg.PoolSize / 2, + MaxActive: rCfg.PoolSize, + // TODO optimize IdleTimeout with config parameter + IdleTimeout: 240 * time.Second, + + // Dial function to create the connection + Dial: func() (redigo.Conn, error) { + timeout := time.Duration(rCfg.Timeout) * time.Millisecond // 假设 rCfg.Timeout 是毫秒 + opts := []redigo.DialOption{ + redigo.DialDatabase(rCfg.DB), + redigo.DialPassword(rCfg.Password), + redigo.DialConnectTimeout(timeout), + // redigo.DialReadTimeout(timeout), + // redigo.DialWriteTimeout(timeout), + // TODO add redigo.DialUsername when redis open acl + // redis.DialUsername("username"), + } + + c, err := redigo.Dial("tcp", rCfg.Addr, opts...) + if err != nil { + return nil, fmt.Errorf("redigo dial failed: %w", err) + } + return c, nil + }, + } + + conn := pool.Get() + defer conn.Close() + + if conn.Err() != nil { + return nil, fmt.Errorf("failed to get connection from pool: %w", conn.Err()) + } + + _, err := conn.Do("PING") + if err != nil { + return nil, fmt.Errorf("redis connection test (PING) failed: %w", err) + } + return pool, nil +}