From f5ba9b2f97fea5a8e0fa83482666640f2eca7424 Mon Sep 17 00:00:00 2001 From: AI Engineer Date: Sat, 20 Jun 2026 22:08:56 +0800 Subject: [PATCH] refactor(redis): streamline JS exports, add singleton with Logger from context - Remove redundant per-command JS shortcuts, unified under Do() - Remove unused PascalCase instance methods - Add getDefaultRedisForJS singleton that extracts log.Logger from Context - Add MakeID export for JS-side distributed ID generation Co-Authored-By: deepseek-v4-pro[1m] --- CHANGELOG.md | 16 +++++++++++++++ js_export.go | 58 +++++++++++++++------------------------------------- 2 files changed, 33 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8ede7b..f2cc393 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # CHANGELOG - redis +## v1.5.5 (2026-06-20) +- **JS 导出重构**: + - 移除 `js_export.go` 中冗余的独立命令快捷函数(SET, GET, DEL, EXISTS, EXPIRE, PUBLISH),统一通过 `Do` 方法调用。 + - 移除未使用的 PascalCase 实例方法(SET, GET, DEL, EXISTS, EXPIRE, HSET, HGET, PUBLISH),精简 API 面积。 + - 新增 `getDefaultRedisForJS` 单例模式,从 Context 中提取 `log.Logger` 传入 `GetRedis`,确保 JS 端 Redis 操作具备完整日志追踪能力。 + - 新增 `MakeID` 函数,为 JS 端暴露分布式 ID 生成能力。 + +## v1.5.4 (2026-06-19) +- **基础设施对齐**: 内部依赖统一升级至 v1.5.x 语义版本。 + +## v1.5.3 (2026-06-18) +- **JS 导出增强**: 对齐 PascalCase 命名规范,扁平化 default 实例的 JS 导出。 + +## v1.5.2 (2026-06-17) +- **依赖修复**: 对齐 `encoding` v1.5.2 接口变更。 + ## v1.5.1 (2026-06-08) - **新增**: `SetConfig(name, setting string)` 方法,支持动态配置 Redis 连接(不依赖配置文件),方便通过别名获取连接。 - **优化**: 重构配置加载逻辑,确保动态配置与配置文件配置的共存与优先级。 diff --git a/js_export.go b/js_export.go index f84439c..a6079a5 100644 --- a/js_export.go +++ b/js_export.go @@ -7,6 +7,7 @@ import ( "apigo.cc/go/id" "apigo.cc/go/jsmod" + "apigo.cc/go/log" ) func init() { @@ -26,7 +27,7 @@ func init() { // 默认快捷调用 (面向 "default" 实例) "Do": func(ctx context.Context, cmd string, args ...any) (*Result, error) { - jr := &jsRedis{rd: GetRedis("default", nil), ctx: ctx} + jr := getDefaultRedisForJS(ctx) if jr.rd.Error != nil { return nil, jr.rd.Error } @@ -34,36 +35,12 @@ func init() { return res, res.Error }, - // 常用命令平铺 (面向 "default" 实例) - "SET": func(ctx context.Context, key string, val any) (*Result, error) { - jr := &jsRedis{rd: GetRedis("default", nil), ctx: ctx} - res := jr.Do("SET", key, val) - return res, res.Error - }, - "GET": func(ctx context.Context, key string) (*Result, error) { - jr := &jsRedis{rd: GetRedis("default", nil), ctx: ctx} - res := jr.Do("GET", key) - return res, res.Error - }, - "DEL": func(ctx context.Context, key string) (*Result, error) { - jr := &jsRedis{rd: GetRedis("default", nil), ctx: ctx} - res := jr.Do("DEL", key) - return res, res.Error - }, - "EXISTS": func(ctx context.Context, key string) (*Result, error) { - jr := &jsRedis{rd: GetRedis("default", nil), ctx: ctx} - res := jr.Do("EXISTS", key) - return res, res.Error - }, - "EXPIRE": func(ctx context.Context, key string, seconds int) (*Result, error) { - jr := &jsRedis{rd: GetRedis("default", nil), ctx: ctx} - res := jr.Do("EXPIRE", key, seconds) - return res, res.Error - }, - "PUBLISH": func(ctx context.Context, channel, data string) (*Result, error) { - jr := &jsRedis{rd: GetRedis("default", nil), ctx: ctx} - res := jr.Do("PUBLISH", channel, data) - return res, res.Error + "MakeID": func(ctx context.Context, size int, forDB *string) string { + jr := getDefaultRedisForJS(ctx) + if jr.rd.Error != nil { + return id.MakeID(size) + } + return jr.MakeID(size, forDB) }, }) } @@ -74,6 +51,15 @@ type jsRedis struct { idMaker *id.IDMaker } +var defaultRedisForJS *jsRedis + +func getDefaultRedisForJS(ctx context.Context) *jsRedis { + if defaultRedisForJS == nil { + defaultRedisForJS = &jsRedis{rd: GetRedis("default", ctx.Value("Logger").(*log.Logger)), ctx: ctx} + } + return defaultRedisForJS +} + var errSafeMode = errors.New("redis operation is restricted in safe mode") // 核心写操作指令集 @@ -105,16 +91,6 @@ func (jr *jsRedis) Do(cmd string, args ...any) *Result { return jr.rd.Do(cmd, args...) } -// 实例方法 PascalCase 对齐 -func (jr *jsRedis) SET(key string, val any) *Result { return jr.Do("SET", key, val) } -func (jr *jsRedis) GET(key string) *Result { return jr.Do("GET", key) } -func (jr *jsRedis) DEL(key string) *Result { return jr.Do("DEL", key) } -func (jr *jsRedis) EXISTS(key string) *Result { return jr.Do("EXISTS", key) } -func (jr *jsRedis) EXPIRE(key string, s int) *Result { return jr.Do("EXPIRE", key, s) } -func (jr *jsRedis) HSET(key, field string, v any) *Result { return jr.Do("HSET", key, field, v) } -func (jr *jsRedis) HGET(key, field string) *Result { return jr.Do("HGET", key, field) } -func (jr *jsRedis) PUBLISH(ch, data string) *Result { return jr.Do("PUBLISH", ch, data) } - // ID Generation func (jr *jsRedis) MakeID(size int, forDB *string) string { if jr.idMaker == nil {