From 3495b56a363e48a9518c5ba9bdd02c07572c1462 Mon Sep 17 00:00:00 2001 From: AI Engineer Date: Mon, 8 Jun 2026 20:47:52 +0800 Subject: [PATCH] feat: add SetConfig for dynamic configuration (by AI) --- CHANGELOG.md | 4 ++++ README.md | 3 ++- config.go | 14 ++++++++++++++ go.mod | 4 ++-- go.sum | 6 ++---- redis.go | 8 ++------ 6 files changed, 26 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40f029f..f8ede7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG - redis +## v1.5.1 (2026-06-08) +- **新增**: `SetConfig(name, setting string)` 方法,支持动态配置 Redis 连接(不依赖配置文件),方便通过别名获取连接。 +- **优化**: 重构配置加载逻辑,确保动态配置与配置文件配置的共存与优先级。 + ## v1.3.3 (2026-05-30) - **新增**: 注册到 `jsmod`。 - **安全性**: 引入基于 Context 的细粒度权限控制。在 `SafeMode` 下,仅允许读取操作(GET/EXISTS/ZRANGE等),所有写操作(SET/DEL/EXPIRE/DO等)将被拦截并返回错误。 diff --git a/README.md b/README.md index 5a92fbf..7276c1b 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ ## API 指南 ### 基础连接 -- `GetRedis(name string, logger *log.Logger) *Redis`: 获取或创建一个 Redis 实例(支持 DSN 或配置文件名)。 +- `SetConfig(name, setting string)`: 动态设置 Redis 配置(不依赖配置文件),可通过别名获取连接。 +- `GetRedis(name string, logger *log.Logger) *Redis`: 获取或创建一个 Redis 实例(支持 DSN、别名或配置文件名)。 - `NewRedis(conf *Config, logger *log.Logger) *Redis`: 使用指定配置创建 Redis 实例。 ### 核心操作 diff --git a/config.go b/config.go index bd46fb0..53a152d 100644 --- a/config.go +++ b/config.go @@ -8,6 +8,7 @@ import ( "time" "apigo.cc/go/cast" + "apigo.cc/go/config" "apigo.cc/go/crypto" "apigo.cc/go/log" "apigo.cc/go/safe" @@ -30,6 +31,19 @@ type Config struct { var redisConfigs = make(map[string]*Config) var redisConfigsLock = sync.RWMutex{} +var redisConfigsOnce sync.Once + +func SetConfig(name, setting string) { + redisConfigsOnce.Do(func() { + _ = config.Load(&redisConfigs, "redis") + }) + + conf := new(Config) + conf.ConfigureBy(setting) + redisConfigsLock.Lock() + redisConfigs[name] = conf + redisConfigsLock.Unlock() +} var confAES *crypto.Symmetric diff --git a/go.mod b/go.mod index 45c9e23..c2ab126 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ 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 - golang.org/x/crypto v0.51.0 // indirect - golang.org/x/sys v0.44.0 // 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 ) diff --git a/go.sum b/go.sum index d6c96f2..9bb4729 100644 --- a/go.sum +++ b/go.sum @@ -28,10 +28,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= -golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/redis.go b/redis.go index dde699c..08bf5a5 100644 --- a/redis.go +++ b/redis.go @@ -57,13 +57,9 @@ func GetRedis(name string, logger *log.Logger) *Redis { return oldConn.CopyByLogger(logger) } - redisConfigsLock.RLock() - configsLen := len(redisConfigs) - redisConfigsLock.RUnlock() - - if configsLen == 0 { + redisConfigsOnce.Do(func() { _ = config.Load(&redisConfigs, "redis") - } + }) fullName := name