Compare commits

...

2 Commits

Author SHA1 Message Date
AI Engineer
f5ba9b2f97 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] <deepseek-ai@claude-code-best.win>
2026-06-20 22:08:56 +08:00
AI Engineer
8761a5a8ac chore: align infrastructure to v1.5.x (by AI) 2026-06-11 22:32:06 +08:00
3 changed files with 44 additions and 52 deletions

View File

@ -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 连接(不依赖配置文件),方便通过别名获取连接。
- **优化**: 重构配置加载逻辑,确保动态配置与配置文件配置的共存与优先级。

22
go.mod
View File

@ -3,21 +3,21 @@ module apigo.cc/go/redis
go 1.25.0
require (
apigo.cc/go/cast v1.5.0
apigo.cc/go/config v1.5.0
apigo.cc/go/crypto v1.5.0
apigo.cc/go/encoding v1.5.0
apigo.cc/go/id v1.5.0
apigo.cc/go/jsmod v1.5.0
apigo.cc/go/log v1.5.0
apigo.cc/go/safe v1.5.0
apigo.cc/go/cast v1.5.2
apigo.cc/go/config v1.5.2
apigo.cc/go/crypto v1.5.2
apigo.cc/go/encoding v1.5.3
apigo.cc/go/id v1.5.3
apigo.cc/go/jsmod v1.5.2
apigo.cc/go/log v1.5.6
apigo.cc/go/safe v1.5.1
github.com/gomodule/redigo v2.0.0+incompatible
)
require (
apigo.cc/go/file v1.5.0 // indirect
apigo.cc/go/rand v1.5.0 // indirect
apigo.cc/go/shell v1.5.0 // indirect
apigo.cc/go/file v1.5.4 // indirect
apigo.cc/go/rand v1.5.2 // indirect
apigo.cc/go/shell v1.5.2 // indirect
golang.org/x/crypto v0.52.0 // indirect
golang.org/x/sys v0.45.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

View File

@ -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 {