From cbcee9ccd882e01368eedad2a98ebfb4b401f19d Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Fri, 9 Oct 2026 11:10:44 +0700 Subject: [PATCH] refactor(adapter)!: drop the valkey adapter in favor of redis Valkey speaks the Redis protocol, so the redis adapter (go-redis) already serves it. Dropping valkey-go removes a dependency and shrinks the stripped binary by about 9 MB. The redis adapter now also closes a client that failed to connect only once. BREAKING CHANGE: `adapter: valkey` is no longer accepted. Use `adapter: redis` with a redis:// or rediss:// URL instead of valkey:// or valkeys://. The namespace option now applies to these services. --- adapter/redis.go | 13 ++++++----- adapter/valkey.go | 55 ---------------------------------------------- config.example.yml | 8 +++++-- config_test.go | 2 +- go.mod | 1 - go.sum | 6 ----- 6 files changed, 15 insertions(+), 70 deletions(-) delete mode 100644 adapter/valkey.go diff --git a/adapter/redis.go b/adapter/redis.go index 93f1878..e3dd350 100644 --- a/adapter/redis.go +++ b/adapter/redis.go @@ -20,6 +20,8 @@ func init() { } } +// redisAdapter serves every RESP-compatible store: Redis, Valkey, Dragonfly, +// KeyDB, Garnet and their hosted variants. type redisAdapter struct { client *redis.Client url string @@ -31,15 +33,16 @@ func (a *redisAdapter) Connect(ctx context.Context) error { if err != nil { return err } - a.client = redis.NewClient(opt) - if err := a.client.Ping(ctx).Err(); err != nil { - a.client.Close() + client := redis.NewClient(opt) + if err := client.Ping(ctx).Err(); err != nil { + client.Close() return err } - if err := a.client.SetNX(ctx, a.key, 0, 0).Err(); err != nil { - a.client.Close() + if err := client.SetNX(ctx, a.key, 0, 0).Err(); err != nil { + client.Close() return err } + a.client = client return nil } diff --git a/adapter/valkey.go b/adapter/valkey.go deleted file mode 100644 index 99dec2c..0000000 --- a/adapter/valkey.go +++ /dev/null @@ -1,55 +0,0 @@ -package adapter - -import ( - "context" - - "github.com/valkey-io/valkey-go" -) - -func init() { - Registry["valkey"] = func(cfg Config) (Adapter, error) { - url, err := cfg.Required("url") - if err != nil { - return nil, err - } - return &valkeyAdapter{ - url: url, - key: cfg.Optional("counter_key", "counter"), - }, nil - } -} - -type valkeyAdapter struct { - client valkey.Client - url string - key string -} - -func (a *valkeyAdapter) Connect(ctx context.Context) error { - opt, err := valkey.ParseURL(a.url) - if err != nil { - return err - } - client, err := valkey.NewClient(opt) - if err != nil { - return err - } - a.client = client - if err := a.client.Do(ctx, a.client.B().Setnx().Key(a.key).Value("0").Build()).Error(); err != nil { - a.client.Close() - return err - } - return nil -} - -func (a *valkeyAdapter) Increment(ctx context.Context) (int64, error) { - return a.client.Do(ctx, a.client.B().Incr().Key(a.key).Build()).AsInt64() -} - -func (a *valkeyAdapter) Close(_ context.Context) error { - if a.client == nil { - return nil - } - a.client.Close() - return nil -} diff --git a/config.example.yml b/config.example.yml index 68a449b..21239c9 100644 --- a/config.example.yml +++ b/config.example.yml @@ -9,12 +9,16 @@ services: url: redis://default@redis-a.example.com:6379 namespace: keepalive - - adapter: valkey + # Valkey, Dragonfly, KeyDB and other Redis-compatible stores use the redis + # adapter with a redis:// or rediss:// (TLS) URL. + - name: valkey-a + adapter: redis # Example: this service overrides root interval and counter_key. interval: 30s counter_key: valkey-counter config: - url: valkey://default@valkey-a.example.com:6379 + url: rediss://default@valkey-a.example.com:6379 + namespace: keepalive - adapter: postgresql config: diff --git a/config_test.go b/config_test.go index cfbb4b0..12d66d1 100644 --- a/config_test.go +++ b/config_test.go @@ -33,7 +33,7 @@ func TestConfigExampleYMLParses(t *testing.T) { if err != nil { t.Fatalf("loadConfigFile returned error: %v", err) } - wantAdapters := []string{"redis", "valkey", "postgresql", "mysql", "mongodb", "couchbase"} + wantAdapters := []string{"redis", "redis", "postgresql", "mysql", "mongodb", "couchbase"} if len(services) != len(wantAdapters) { t.Fatalf("len(services) = %d, want %d", len(services), len(wantAdapters)) } diff --git a/go.mod b/go.mod index 469b1e3..fc11131 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,6 @@ require ( github.com/go-sql-driver/mysql v1.10.0 github.com/lib/pq v1.12.3 github.com/redis/go-redis/v9 v9.19.0 - github.com/valkey-io/valkey-go v1.0.75 go.mongodb.org/mongo-driver/v2 v2.6.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index 3c305ef..717bf71 100644 --- a/go.sum +++ b/go.sum @@ -47,8 +47,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ= github.com/lib/pq v1.12.3/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= -github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= -github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= 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/redis/go-redis/v9 v9.19.0 h1:XPVaaPSnG6RhYf7p+rmSa9zZfeVAnWsH5h3lxthOm/k= @@ -59,8 +57,6 @@ github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/valkey-io/valkey-go v1.0.75 h1:cfq9DODW2ntuUgyHJmFWb4/p+xpLpQB1t5SQyWM9uJ4= -github.com/valkey-io/valkey-go v1.0.75/go.mod h1:6X581PhgfeMkJmyfjIsa2eFdq6dy3Qkkg9zwjM1p42M= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= @@ -96,8 +92,6 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= -go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw=