feat: add SetConfig for dynamic configuration (by AI)

This commit is contained in:
AI Engineer 2026-06-08 20:47:52 +08:00
parent c36b771ca0
commit 3495b56a36
6 changed files with 26 additions and 13 deletions

View File

@ -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等将被拦截并返回错误。

View File

@ -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 实例。
### 核心操作

View File

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

4
go.mod
View File

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

6
go.sum
View File

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

View File

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