Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
868bd819a6 | ||
|
|
4d8d18de7b | ||
|
|
7f5ff81446 | ||
|
|
b787e35c3c | ||
|
|
f3bd2890bb | ||
|
|
8a7e709124 | ||
|
|
b1b000d9a3 | ||
|
|
e9ffae9fd2 | ||
|
|
89f71eecd8 | ||
|
|
0c6b00febb | ||
|
|
d409b4026e | ||
|
|
6b6b2cae9b |
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
.log.meta.json
|
||||||
|
.ai/
|
||||||
|
.geminiignore
|
||||||
|
.gemini
|
||||||
|
env.json
|
||||||
|
env.yml
|
||||||
|
env.yaml
|
||||||
|
/CODE-FULL.md
|
||||||
29
CHANGELOG.md
29
CHANGELOG.md
@ -1,8 +1,35 @@
|
|||||||
# CHANGELOG - redis
|
# CHANGELOG - redis
|
||||||
|
|
||||||
|
## v1.0.8 (2026-05-10)
|
||||||
|
- **API 对齐**:
|
||||||
|
- `NewIDMaker` 返回值从 `*IDMaker` 修改为 `*id.IDMaker`,保持全局接口统一。
|
||||||
|
- 移除了 `redis.IDMaker` 冗余的包装方法,直接使用 `id.IDMaker` 的实现。
|
||||||
|
|
||||||
|
## v1.0.7 (2026-05-09)
|
||||||
|
- **基础设施对齐**:
|
||||||
|
- 升级 `apigo.cc/go/log` 至 `v1.1.13`。
|
||||||
|
- `redis` 包不涉及自定义日志类型,本次升级无代码变更。
|
||||||
|
|
||||||
|
## v1.0.6 (2026-05-07)
|
||||||
|
- **Security & Compatibility**:
|
||||||
|
- 增强 `Redis` 密码解密逻辑,支持 URL-safe Base64 编码的加密密码,提升多平台配置兼容性。
|
||||||
|
- **Maintenance**:
|
||||||
|
- 升级依赖 `apigo.cc/go/cast` (v1.2.8) 与 `apigo.cc/go/log` (v1.1.9)。
|
||||||
|
- 依赖 `apigo.cc/go/encoding` (v1.0.5) 正式转为显式引用。
|
||||||
|
|
||||||
|
## v1.0.5 (2026-05-06)
|
||||||
|
- **Maintenance**:
|
||||||
|
- 内部依赖对齐与升级 (`config`, `crypto`, `id`, `safe` 等至 v1.0.5/v1.0.6)。
|
||||||
|
- 移除了冗余的 `replace` 指令,清理 `go.sum`。
|
||||||
|
|
||||||
|
## v1.0.4 (2026-05-06)
|
||||||
|
- **Maintenance**:
|
||||||
|
- 添加 `.gitignore` 以排除日志元数据。
|
||||||
|
- 升级 `apigo.cc/go/log` 至 v1.1.3。
|
||||||
|
|
||||||
## v1.0.3 (2026-05-05)
|
## v1.0.3 (2026-05-05)
|
||||||
- **PubSub Robustness**:
|
- **PubSub Robustness**:
|
||||||
- 重构 `Redis` 结构体,引入 `pubsub` 内部结构管理共享状态。
|
- 重构 `Redis` 结构体,引入 `pubsub` 内部结构 management 共享状态。
|
||||||
- 修复了 `CopyByLogger` 场景下 `subs` map 与 `subLock` 不匹配导致的并发竞争风险。
|
- 修复了 `CopyByLogger` 场景下 `subs` map 与 `subLock` 不匹配导致的并发竞争风险。
|
||||||
- 优化 `Start()` 方法,增加运行状态检查,防止冗余的订阅协程启动。
|
- 优化 `Start()` 方法,增加运行状态检查,防止冗余的订阅协程启动。
|
||||||
- 增强 `Stop()` 方法的生命周期管理,确保协程安全退出并清理停止通道。
|
- 增强 `Stop()` 方法的生命周期管理,确保协程安全退出并清理停止通道。
|
||||||
|
|||||||
@ -32,9 +32,7 @@
|
|||||||
- `Stop()`: 停止所有订阅。
|
- `Stop()`: 停止所有订阅。
|
||||||
|
|
||||||
### 分布式 ID (IDMaker)
|
### 分布式 ID (IDMaker)
|
||||||
- `NewIDMaker(rd *Redis) *IDMaker`: 创建分布式 ID 生成器。
|
- `NewIDMaker(rd *Redis) *id.IDMaker`: 创建基于 Redis 的分布式 ID 生成器。
|
||||||
- `Get(size int)`: 获取指定长度的唯一 ID。
|
|
||||||
- `GetForMysql(size int)`: 获取针对 MySQL 优化的唯一 ID。
|
|
||||||
|
|
||||||
## 示例
|
## 示例
|
||||||
|
|
||||||
|
|||||||
14
config.go
14
config.go
@ -31,14 +31,16 @@ type Config struct {
|
|||||||
var redisConfigs = make(map[string]*Config)
|
var redisConfigs = make(map[string]*Config)
|
||||||
var redisConfigsLock = sync.RWMutex{}
|
var redisConfigsLock = sync.RWMutex{}
|
||||||
|
|
||||||
var confAes, _ = crypto.NewAESGCMAndEraseKey([]byte("?GQ$0K0GgLdO=f+~L68PLm$uhKr4'=tV"), []byte("VFs7@sK61cj^f?HZ"))
|
var confAES *crypto.Symmetric
|
||||||
var keysOnce = sync.Once{}
|
|
||||||
|
func init() {
|
||||||
|
crypto.OnSetDefaultAES(func(aes *crypto.Symmetric) {
|
||||||
|
confAES = aes
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func SetEncryptKeys(key, iv []byte) {
|
func SetEncryptKeys(key, iv []byte) {
|
||||||
keysOnce.Do(func() {
|
crypto.SetDefaultAES(key, iv)
|
||||||
confAes.Close()
|
|
||||||
confAes, _ = crypto.NewAESGCMAndEraseKey(key, iv)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (conf *Config) ConfigureBy(setting string) {
|
func (conf *Config) ConfigureBy(setting string) {
|
||||||
|
|||||||
29
go.mod
29
go.mod
@ -3,26 +3,21 @@ module apigo.cc/go/redis
|
|||||||
go 1.25.0
|
go 1.25.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
apigo.cc/go/cast v1.2.6
|
apigo.cc/go/cast v1.3.3
|
||||||
apigo.cc/go/config v1.0.5
|
apigo.cc/go/config v1.3.1
|
||||||
apigo.cc/go/crypto v1.0.4
|
apigo.cc/go/crypto v1.3.1
|
||||||
apigo.cc/go/id v1.0.4
|
apigo.cc/go/encoding v1.3.1
|
||||||
apigo.cc/go/log v1.1.1
|
apigo.cc/go/id v1.3.1
|
||||||
apigo.cc/go/safe v1.0.4
|
apigo.cc/go/log v1.3.4
|
||||||
|
apigo.cc/go/safe v1.3.1
|
||||||
github.com/gomodule/redigo v1.9.3
|
github.com/gomodule/redigo v1.9.3
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
apigo.cc/go/convert v1.0.4 // indirect
|
apigo.cc/go/file v1.3.2 // indirect
|
||||||
apigo.cc/go/encoding v1.0.4 // indirect
|
apigo.cc/go/rand v1.3.1 // indirect
|
||||||
apigo.cc/go/file v1.0.4 // indirect
|
apigo.cc/go/shell v1.3.1 // indirect
|
||||||
apigo.cc/go/rand v1.0.4 // indirect
|
golang.org/x/crypto v0.51.0 // indirect
|
||||||
apigo.cc/go/shell v1.0.4 // indirect
|
golang.org/x/sys v0.44.0 // indirect
|
||||||
github.com/kr/pretty v0.3.0 // indirect
|
|
||||||
github.com/rogpeppe/go-internal v1.14.1 // indirect
|
|
||||||
github.com/stretchr/testify v1.11.1 // indirect
|
|
||||||
golang.org/x/crypto v0.50.0 // indirect
|
|
||||||
golang.org/x/sys v0.43.0 // indirect
|
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
62
go.sum
62
go.sum
@ -1,53 +1,43 @@
|
|||||||
apigo.cc/go/cast v1.2.6 h1:xnWiaQAGsRCrnu1p8fIFQfg5HFSc7CxR+3ItiDIDMaY=
|
apigo.cc/go/cast v1.3.3 h1:aln5eDR5DZVWVzZ/y5SJh1gQNgWv2sT82I25NaO9g34=
|
||||||
apigo.cc/go/cast v1.2.6/go.mod h1:lGlwImiOvHxG7buyMWhFzcdvQzmSaoKbmr7bcDfUpHk=
|
apigo.cc/go/cast v1.3.3/go.mod h1:lGlwImiOvHxG7buyMWhFzcdvQzmSaoKbmr7bcDfUpHk=
|
||||||
apigo.cc/go/config v1.0.4 h1:WG9zrQkqfFPkrKIL7RNvvAbbkuUBt1Av11ZP/aIfldM=
|
apigo.cc/go/config v1.3.1 h1:wZzUh4oL+fGD6SayVgX6prLPMsniM25etWFcEH8XzIE=
|
||||||
apigo.cc/go/config v1.0.4/go.mod h1:obryzJiK6j7lQex/58d5eWYOGx5O5IABguqNWxyyXJo=
|
apigo.cc/go/config v1.3.1/go.mod h1:7KHz/1WmtBLM762Lln/TaXh2dmlMvJTLhnlk33zbS3U=
|
||||||
apigo.cc/go/convert v1.0.4 h1:5+qPjC3dlPB59GnWZRlmthxcaXQtKvN+iOuiLdJ1GvQ=
|
apigo.cc/go/crypto v1.3.1 h1:ulQ2zX9bUWirk0sEacx1Srsjs2Jow7HlZq7ED7msNcg=
|
||||||
apigo.cc/go/convert v1.0.4/go.mod h1:Hp+geeSyhqg/zwIKPOrDoceIREzcwM14t1I5q/dtbfU=
|
apigo.cc/go/crypto v1.3.1/go.mod h1:SwHlBFDPddttWgFFtzsEMla8CM/rcFy9nvdsJjW4CIs=
|
||||||
apigo.cc/go/crypto v1.0.4 h1:VPUyHCH2N3LLEgdpwUc+DQssNHzLlxVzLNRa0Jm6O4o=
|
apigo.cc/go/encoding v1.3.1 h1:y8O58KYAyulkThg1O2ji2BqjnFoSvk42sit9I3z+K7Y=
|
||||||
apigo.cc/go/crypto v1.0.4/go.mod h1:5sI8BLw6YHZfDReYwCO3TFD2LKm36HMdLg1S5oPv/QU=
|
apigo.cc/go/encoding v1.3.1/go.mod h1:xAJk5b83VZ31mXMTnyp0dfMoBKfT/AHDn0u+cQfojgY=
|
||||||
apigo.cc/go/encoding v1.0.4 h1:aezB0J/qFuHs6iXkbtuJP5JIHUtmjsr5SFb0NNvbObY=
|
apigo.cc/go/file v1.3.2 h1:pu4oiDyiqgj3/eykfnJf+/6+A9v/Z0b3ClP5XK+lwG4=
|
||||||
apigo.cc/go/encoding v1.0.4/go.mod h1:V5CgT7rBbCxy+uCU20q0ptcNNRSgMtpA8cNOs6r8IeI=
|
apigo.cc/go/file v1.3.2/go.mod h1:vci4h0Pz94mV6dkniQkuyBYERVYeq7/LX4jJVuCg9hs=
|
||||||
apigo.cc/go/file v1.0.4 h1:qCKegV7OYh7r0qc3jZjGA/aKh0vIHgmr1OEbhfEmGX8=
|
apigo.cc/go/id v1.3.1 h1:pkqi6VeWyQoHuIu0Zbx/RRxIAdM61Js0j6cY1M9XVCk=
|
||||||
apigo.cc/go/file v1.0.4/go.mod h1:C9gNo7386iA21OiBmuWh6CznKWlVBDFkhE4f0H0Susg=
|
apigo.cc/go/id v1.3.1/go.mod h1:P2/vl3tyW3US+ayOFSMoPIOCulNLBngNYPhXJC/Z7J4=
|
||||||
apigo.cc/go/id v1.0.4 h1:w+JSdeVit52iefIUolrh1qLEZS9XqHNKr1UygFcgv+s=
|
apigo.cc/go/log v1.3.4 h1:UT8Neb9r4QjjbCFbTzw+ZeTxd+DmdmR5gNExeR4Cj+g=
|
||||||
apigo.cc/go/id v1.0.4/go.mod h1:kg7QuceAKtGNzGWt0+pIIh8Qom1eMSWGb8+0Yhi/QVY=
|
apigo.cc/go/log v1.3.4/go.mod h1:/Q/2r51xWSsrS4QN5U9jLiTw8n6qNC8kG9nuVHweY20=
|
||||||
apigo.cc/go/log v1.0.2 h1:OY6T3SC28blDNkMpdRvDK2N4sGdriAB9DBItGl/qOos=
|
apigo.cc/go/rand v1.3.1 h1:7FvsI6PtQ5XrWER0dTiLVo0p7GIxRidT/TBKhVy93j8=
|
||||||
apigo.cc/go/log v1.0.2/go.mod h1:tvPgFpebY9Wf/DlqMHZ0ZjxDp9AaQTywOQKvtBaNqNo=
|
apigo.cc/go/rand v1.3.1/go.mod h1:mZ/4Soa3bk+XvDaqPWJuUe1bfEi4eThBj1XmEAuYxsk=
|
||||||
apigo.cc/go/rand v1.0.4 h1:we070eWSL0dB8NEMaWjXj43+EekXQTm/h0kKpZ/frqw=
|
apigo.cc/go/safe v1.3.1 h1:irTCqPAC97gGsX/Lw5AzLelDt1xXLEZIAaVhLELWe9Q=
|
||||||
apigo.cc/go/rand v1.0.4/go.mod h1:mZ/4Soa3bk+XvDaqPWJuUe1bfEi4eThBj1XmEAuYxsk=
|
apigo.cc/go/safe v1.3.1/go.mod h1:XdOpBhN2vkImalaykYXXmEpczqWa1y3ah6/Q72cdRqE=
|
||||||
apigo.cc/go/safe v1.0.4 h1:07pRSdEHprF/2v6SsqAjICYFoeLcqjjvHGEdh6Dzrzg=
|
apigo.cc/go/shell v1.3.1 h1:M8oD0b2HcJuCC6frQFx11b3UTcTx3lATX8XK+YXSVm8=
|
||||||
apigo.cc/go/safe v1.0.4/go.mod h1:o568sHS5rTRSVPmhxWod0tGdc+8l1KjidsNY1/OVZr0=
|
apigo.cc/go/shell v1.3.1/go.mod h1:ZMdJjpCpWdvsHKUXlelh/AxsV/nWdkH/k3lISfzMdUw=
|
||||||
apigo.cc/go/shell v1.0.4 h1:EL9zjI39YBe1h+kRYQeAi/8zVGHe5W198DYYN7cENiY=
|
|
||||||
apigo.cc/go/shell v1.0.4/go.mod h1:N2gDkgK4tJ9TadD60/+gAGuWxyVAWHs5YPBmytw6ELA=
|
|
||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/gomodule/redigo v1.9.3 h1:dNPSXeXv6HCq2jdyWfjgmhBdqnR6PRO3m/G05nvpPC8=
|
github.com/gomodule/redigo v1.9.3 h1:dNPSXeXv6HCq2jdyWfjgmhBdqnR6PRO3m/G05nvpPC8=
|
||||||
github.com/gomodule/redigo v1.9.3/go.mod h1:KsU3hiK/Ay8U42qpaJk+kuNa3C+spxapWpM+ywhcgtw=
|
github.com/gomodule/redigo v1.9.3/go.mod h1:KsU3hiK/Ay8U42qpaJk+kuNa3C+spxapWpM+ywhcgtw=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
|
||||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
|
||||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI=
|
golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=
|
||||||
golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q=
|
golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
|
||||||
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
|
golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
|
||||||
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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 h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
24
id.go
24
id.go
@ -7,22 +7,20 @@ import (
|
|||||||
"apigo.cc/go/id"
|
"apigo.cc/go/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
type IDMaker struct {
|
type idMaker struct {
|
||||||
rd *Redis
|
rd *Redis
|
||||||
secCurrent uint64
|
secCurrent uint64
|
||||||
secIndexMax uint64
|
secIndexMax uint64
|
||||||
secIndexNext uint64
|
secIndexNext uint64
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
maker *id.IDMaker
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewIDMaker(rd *Redis) *IDMaker {
|
func NewIDMaker(rd *Redis) *id.IDMaker {
|
||||||
im := &IDMaker{rd: rd}
|
im := &idMaker{rd: rd}
|
||||||
im.maker = id.NewIDMaker(im.makeSecIndex)
|
return id.NewIDMaker(im.makeSecIndex)
|
||||||
return im
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (im *IDMaker) makeSecIndex(sec uint64) uint64 {
|
func (im *idMaker) makeSecIndex(sec uint64) uint64 {
|
||||||
im.lock.Lock()
|
im.lock.Lock()
|
||||||
defer im.lock.Unlock()
|
defer im.lock.Unlock()
|
||||||
|
|
||||||
@ -48,15 +46,3 @@ func (im *IDMaker) makeSecIndex(sec uint64) uint64 {
|
|||||||
}
|
}
|
||||||
return idx
|
return idx
|
||||||
}
|
}
|
||||||
|
|
||||||
func (im *IDMaker) Get(size int) string {
|
|
||||||
return im.maker.Get(size)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (im *IDMaker) GetForMysql(size int) string {
|
|
||||||
return im.maker.GetForMysql(size)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (im *IDMaker) GetForPostgreSQL(size int) string {
|
|
||||||
return im.maker.GetForPostgreSQL(size)
|
|
||||||
}
|
|
||||||
|
|||||||
18
redis.go
18
redis.go
@ -14,6 +14,7 @@ import (
|
|||||||
|
|
||||||
"apigo.cc/go/cast"
|
"apigo.cc/go/cast"
|
||||||
"apigo.cc/go/config"
|
"apigo.cc/go/config"
|
||||||
|
"apigo.cc/go/encoding"
|
||||||
"apigo.cc/go/log"
|
"apigo.cc/go/log"
|
||||||
"apigo.cc/go/safe"
|
"apigo.cc/go/safe"
|
||||||
"github.com/gomodule/redigo/redis"
|
"github.com/gomodule/redigo/redis"
|
||||||
@ -75,7 +76,7 @@ func GetRedis(name string, logger *log.Logger) *Redis {
|
|||||||
conf = parseByName(name)
|
conf = parseByName(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
if pwd, err := confAes.Decrypt([]byte(conf.Password)); err == nil {
|
if pwd, err := confAES.Decrypt(cast.As(encoding.UnUrlBase64FromString(conf.Password))); err == nil {
|
||||||
conf.pwd = pwd
|
conf.pwd = pwd
|
||||||
} else {
|
} else {
|
||||||
conf.pwd = safe.NewSafeBuf([]byte(conf.Password))
|
conf.pwd = safe.NewSafeBuf([]byte(conf.Password))
|
||||||
@ -112,6 +113,21 @@ func GetRedis(name string, logger *log.Logger) *Redis {
|
|||||||
return rd.CopyByLogger(logger)
|
return rd.CopyByLogger(logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do 执行 Redis 命令 (使用默认实例 "default")
|
||||||
|
func Do(cmd string, values ...any) *Result {
|
||||||
|
return GetRedis("default", nil).Do(cmd, values...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Subscribe 订阅频道 (使用默认实例 "default")
|
||||||
|
func Subscribe(name string, reset func(), received func([]byte)) bool {
|
||||||
|
return GetRedis("default", nil).Subscribe(name, reset, received)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PUBLISH 发布消息 (使用默认实例 "default")
|
||||||
|
func PUBLISH(channel, data string) bool {
|
||||||
|
return GetRedis("default", nil).PUBLISH(channel, data)
|
||||||
|
}
|
||||||
|
|
||||||
func NewRedis(conf *Config, logger *log.Logger) *Redis {
|
func NewRedis(conf *Config, logger *log.Logger) *Redis {
|
||||||
if logger == nil {
|
if logger == nil {
|
||||||
logger = log.DefaultLogger
|
logger = log.DefaultLogger
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user