Merge pull request #263 from alexgridx/dependabot/go_modules/github.com/redis/go-redis/v9-9.7.0

Bump github.com/redis/go-redis/v9 from 9.6.1 to 9.7.0
This commit is contained in:
Alex 2025-01-16 10:24:19 +01:00 committed by GitHub
commit f514d715ea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 2456 additions and 64 deletions

2
go.mod
View file

@ -16,7 +16,7 @@ require (
github.com/lib/pq v1.10.9 github.com/lib/pq v1.10.9
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.20.4 github.com/prometheus/client_golang v1.20.4
github.com/redis/go-redis/v9 v9.6.1 github.com/redis/go-redis/v9 v9.7.0
golang.org/x/sync v0.8.0 golang.org/x/sync v0.8.0
) )

4
go.sum
View file

@ -98,8 +98,8 @@ github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJN
github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA= github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=

View file

@ -14,6 +14,7 @@ test: testdeps
go test ./... -short -race && \ go test ./... -short -race && \
go test ./... -run=NONE -bench=. -benchmem && \ go test ./... -run=NONE -bench=. -benchmem && \
env GOOS=linux GOARCH=386 go test && \ env GOOS=linux GOARCH=386 go test && \
go test -coverprofile=coverage.txt -covermode=atomic ./... && \
go vet); \ go vet); \
done done
cd internal/customvet && go build . cd internal/customvet && go build .

View file

@ -3,6 +3,7 @@
[![build workflow](https://github.com/redis/go-redis/actions/workflows/build.yml/badge.svg)](https://github.com/redis/go-redis/actions) [![build workflow](https://github.com/redis/go-redis/actions/workflows/build.yml/badge.svg)](https://github.com/redis/go-redis/actions)
[![PkgGoDev](https://pkg.go.dev/badge/github.com/redis/go-redis/v9)](https://pkg.go.dev/github.com/redis/go-redis/v9?tab=doc) [![PkgGoDev](https://pkg.go.dev/badge/github.com/redis/go-redis/v9)](https://pkg.go.dev/github.com/redis/go-redis/v9?tab=doc)
[![Documentation](https://img.shields.io/badge/redis-documentation-informational)](https://redis.uptrace.dev/) [![Documentation](https://img.shields.io/badge/redis-documentation-informational)](https://redis.uptrace.dev/)
[![codecov](https://codecov.io/github/redis/go-redis/graph/badge.svg?token=tsrCZKuSSw)](https://codecov.io/github/redis/go-redis)
[![Chat](https://discordapp.com/api/guilds/752070105847955518/widget.png)](https://discord.gg/rWtp5Aj) [![Chat](https://discordapp.com/api/guilds/752070105847955518/widget.png)](https://discord.gg/rWtp5Aj)
> go-redis is brought to you by :star: [**uptrace/uptrace**](https://github.com/uptrace/uptrace). > go-redis is brought to you by :star: [**uptrace/uptrace**](https://github.com/uptrace/uptrace).
@ -182,6 +183,9 @@ rdb := redis.NewClient(&redis.Options{
}) })
``` ```
#### Unstable RESP3 Structures for RediSearch Commands
When integrating Redis with application functionalities using RESP3, it's important to note that some response structures aren't final yet. This is especially true for more complex structures like search and query results. We recommend using RESP2 when using the search and query capabilities, but we plan to stabilize the RESP3-based API-s in the coming versions. You can find more guidance in the upcoming release notes.
## Contributing ## Contributing
Please see [out contributing guidelines](CONTRIBUTING.md) to help us improve this library! Please see [out contributing guidelines](CONTRIBUTING.md) to help us improve this library!

View file

@ -40,7 +40,7 @@ type Cmder interface {
readTimeout() *time.Duration readTimeout() *time.Duration
readReply(rd *proto.Reader) error readReply(rd *proto.Reader) error
readRawReply(rd *proto.Reader) error
SetErr(error) SetErr(error)
Err() error Err() error
} }
@ -126,7 +126,7 @@ type baseCmd struct {
args []interface{} args []interface{}
err error err error
keyPos int8 keyPos int8
rawVal interface{}
_readTimeout *time.Duration _readTimeout *time.Duration
} }
@ -197,6 +197,11 @@ func (cmd *baseCmd) setReadTimeout(d time.Duration) {
cmd._readTimeout = &d cmd._readTimeout = &d
} }
func (cmd *baseCmd) readRawReply(rd *proto.Reader) (err error) {
cmd.rawVal, err = rd.ReadReply()
return err
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
type Cmd struct { type Cmd struct {
@ -3787,6 +3792,65 @@ func (cmd *MapStringStringSliceCmd) readReply(rd *proto.Reader) error {
return nil return nil
} }
// -----------------------------------------------------------------------
// MapStringInterfaceCmd represents a command that returns a map of strings to interface{}.
type MapMapStringInterfaceCmd struct {
baseCmd
val map[string]interface{}
}
func NewMapMapStringInterfaceCmd(ctx context.Context, args ...interface{}) *MapMapStringInterfaceCmd {
return &MapMapStringInterfaceCmd{
baseCmd: baseCmd{
ctx: ctx,
args: args,
},
}
}
func (cmd *MapMapStringInterfaceCmd) String() string {
return cmdString(cmd, cmd.val)
}
func (cmd *MapMapStringInterfaceCmd) SetVal(val map[string]interface{}) {
cmd.val = val
}
func (cmd *MapMapStringInterfaceCmd) Result() (map[string]interface{}, error) {
return cmd.val, cmd.err
}
func (cmd *MapMapStringInterfaceCmd) Val() map[string]interface{} {
return cmd.val
}
func (cmd *MapMapStringInterfaceCmd) readReply(rd *proto.Reader) (err error) {
n, err := rd.ReadArrayLen()
if err != nil {
return err
}
data := make(map[string]interface{}, n/2)
for i := 0; i < n; i += 2 {
_, err := rd.ReadArrayLen()
if err != nil {
cmd.err = err
}
key, err := rd.ReadString()
if err != nil {
cmd.err = err
}
value, err := rd.ReadString()
if err != nil {
cmd.err = err
}
data[key] = value
}
cmd.val = data
return nil
}
//----------------------------------------------------------------------- //-----------------------------------------------------------------------
type MapStringInterfaceSliceCmd struct { type MapStringInterfaceSliceCmd struct {

View file

@ -220,6 +220,7 @@ type Cmdable interface {
ProbabilisticCmdable ProbabilisticCmdable
PubSubCmdable PubSubCmdable
ScriptingFunctionsCmdable ScriptingFunctionsCmdable
SearchCmdable
SetCmdable SetCmdable
SortedSetCmdable SortedSetCmdable
StringCmdable StringCmdable

View file

@ -3,10 +3,8 @@ package pool
import ( import (
"bufio" "bufio"
"context" "context"
"crypto/tls"
"net" "net"
"sync/atomic" "sync/atomic"
"syscall"
"time" "time"
"github.com/redis/go-redis/v9/internal/proto" "github.com/redis/go-redis/v9/internal/proto"
@ -18,9 +16,6 @@ type Conn struct {
usedAt int64 // atomic usedAt int64 // atomic
netConn net.Conn netConn net.Conn
// for checking the health status of the connection, it may be nil.
sysConn syscall.Conn
rd *proto.Reader rd *proto.Reader
bw *bufio.Writer bw *bufio.Writer
wr *proto.Writer wr *proto.Writer
@ -39,7 +34,6 @@ func NewConn(netConn net.Conn) *Conn {
cn.bw = bufio.NewWriter(netConn) cn.bw = bufio.NewWriter(netConn)
cn.wr = proto.NewWriter(cn.bw) cn.wr = proto.NewWriter(cn.bw)
cn.SetUsedAt(time.Now()) cn.SetUsedAt(time.Now())
cn.setSysConn()
return cn return cn
} }
@ -56,22 +50,6 @@ func (cn *Conn) SetNetConn(netConn net.Conn) {
cn.netConn = netConn cn.netConn = netConn
cn.rd.Reset(netConn) cn.rd.Reset(netConn)
cn.bw.Reset(netConn) cn.bw.Reset(netConn)
cn.setSysConn()
}
func (cn *Conn) setSysConn() {
cn.sysConn = nil
conn := cn.netConn
if conn == nil {
return
}
if tlsConn, ok := conn.(*tls.Conn); ok {
conn = tlsConn.NetConn()
}
if sysConn, ok := conn.(syscall.Conn); ok {
cn.sysConn = sysConn
}
} }
func (cn *Conn) Write(b []byte) (int, error) { func (cn *Conn) Write(b []byte) (int, error) {

View file

@ -5,12 +5,21 @@ package pool
import ( import (
"errors" "errors"
"io" "io"
"net"
"syscall" "syscall"
"time"
) )
var errUnexpectedRead = errors.New("unexpected read from socket") var errUnexpectedRead = errors.New("unexpected read from socket")
func connCheck(sysConn syscall.Conn) error { func connCheck(conn net.Conn) error {
// Reset previous timeout.
_ = conn.SetDeadline(time.Time{})
sysConn, ok := conn.(syscall.Conn)
if !ok {
return nil
}
rawConn, err := sysConn.SyscallConn() rawConn, err := sysConn.SyscallConn()
if err != nil { if err != nil {
return err return err

View file

@ -2,8 +2,8 @@
package pool package pool
import "syscall" import "net"
func connCheck(_ syscall.Conn) error { func connCheck(conn net.Conn) error {
return nil return nil
} }

View file

@ -499,8 +499,6 @@ func (p *ConnPool) Close() error {
return firstErr return firstErr
} }
var zeroTime = time.Time{}
func (p *ConnPool) isHealthyConn(cn *Conn) bool { func (p *ConnPool) isHealthyConn(cn *Conn) bool {
now := time.Now() now := time.Now()
@ -511,13 +509,9 @@ func (p *ConnPool) isHealthyConn(cn *Conn) bool {
return false return false
} }
if cn.sysConn != nil { if connCheck(cn.netConn) != nil {
// reset previous timeout.
_ = cn.netConn.SetDeadline(zeroTime)
if connCheck(cn.sysConn) != nil {
return false return false
} }
}
cn.SetUsedAt(now) cn.SetUsedAt(now)
return true return true

View file

@ -3,6 +3,7 @@ package internal
import ( import (
"context" "context"
"net" "net"
"strconv"
"strings" "strings"
"time" "time"
@ -81,3 +82,47 @@ func GetAddr(addr string) string {
} }
return net.JoinHostPort(addr[:ind], addr[ind+1:]) return net.JoinHostPort(addr[:ind], addr[ind+1:])
} }
func ToInteger(val interface{}) int {
switch v := val.(type) {
case int:
return v
case int64:
return int(v)
case string:
i, _ := strconv.Atoi(v)
return i
default:
return 0
}
}
func ToFloat(val interface{}) float64 {
switch v := val.(type) {
case float64:
return v
case string:
f, _ := strconv.ParseFloat(v, 64)
return f
default:
return 0.0
}
}
func ToString(val interface{}) string {
if str, ok := val.(string); ok {
return str
}
return ""
}
func ToStringSlice(val interface{}) []string {
if arr, ok := val.([]interface{}); ok {
result := make([]string, len(arr))
for i, v := range arr {
result[i] = ToString(v)
}
return result
}
return nil
}

View file

@ -60,7 +60,7 @@ type JSONArrTrimArgs struct {
type JSONCmd struct { type JSONCmd struct {
baseCmd baseCmd
val string val string
expanded []interface{} expanded interface{}
} }
var _ Cmder = (*JSONCmd)(nil) var _ Cmder = (*JSONCmd)(nil)
@ -100,11 +100,11 @@ func (cmd *JSONCmd) Result() (string, error) {
return cmd.Val(), cmd.Err() return cmd.Val(), cmd.Err()
} }
func (cmd JSONCmd) Expanded() (interface{}, error) { func (cmd *JSONCmd) Expanded() (interface{}, error) {
if len(cmd.val) != 0 && cmd.expanded == nil { if len(cmd.val) != 0 && cmd.expanded == nil {
err := json.Unmarshal([]byte(cmd.val), &cmd.expanded) err := json.Unmarshal([]byte(cmd.val), &cmd.expanded)
if err != nil { if err != nil {
return "", err return nil, err
} }
} }
@ -494,7 +494,7 @@ func (c cmdable) JSONMSet(ctx context.Context, params ...interface{}) *StatusCmd
} }
// JSONNumIncrBy increments the number value stored at the specified path by the provided number. // JSONNumIncrBy increments the number value stored at the specified path by the provided number.
// For more information, see https://redis.io/commands/json.numincreby // For more information, see https://redis.io/docs/latest/commands/json.numincrby/
func (c cmdable) JSONNumIncrBy(ctx context.Context, key, path string, value float64) *JSONCmd { func (c cmdable) JSONNumIncrBy(ctx context.Context, key, path string, value float64) *JSONCmd {
args := []interface{}{"JSON.NUMINCRBY", key, path, value} args := []interface{}{"JSON.NUMINCRBY", key, path, value}
cmd := newJSONCmd(ctx, args...) cmd := newJSONCmd(ctx, args...)

View file

@ -153,6 +153,9 @@ type Options struct {
// Add suffix to client name. Default is empty. // Add suffix to client name. Default is empty.
IdentitySuffix string IdentitySuffix string
// Enable Unstable mode for Redis Search module with RESP3.
UnstableResp3 bool
} }
func (opt *Options) init() { func (opt *Options) init() {

View file

@ -412,6 +412,19 @@ func (c *baseClient) process(ctx context.Context, cmd Cmder) error {
return lastErr return lastErr
} }
func (c *baseClient) assertUnstableCommand(cmd Cmder) bool {
switch cmd.(type) {
case *AggregateCmd, *FTInfoCmd, *FTSpellCheckCmd, *FTSearchCmd, *FTSynDumpCmd:
if c.opt.UnstableResp3 {
return true
} else {
panic("RESP3 responses for this command are disabled because they may still change. Please set the flag UnstableResp3 . See the [README](https://github.com/redis/go-redis/blob/master/README.md) and the release notes for guidance.")
}
default:
return false
}
}
func (c *baseClient) _process(ctx context.Context, cmd Cmder, attempt int) (bool, error) { func (c *baseClient) _process(ctx context.Context, cmd Cmder, attempt int) (bool, error) {
if attempt > 0 { if attempt > 0 {
if err := internal.Sleep(ctx, c.retryBackoff(attempt)); err != nil { if err := internal.Sleep(ctx, c.retryBackoff(attempt)); err != nil {
@ -427,8 +440,12 @@ func (c *baseClient) _process(ctx context.Context, cmd Cmder, attempt int) (bool
atomic.StoreUint32(&retryTimeout, 1) atomic.StoreUint32(&retryTimeout, 1)
return err return err
} }
readReplyFunc := cmd.readReply
if err := cn.WithReader(c.context(ctx), c.cmdTimeout(cmd), cmd.readReply); err != nil { // Apply unstable RESP3 search module.
if c.opt.Protocol != 2 && c.assertUnstableCommand(cmd) {
readReplyFunc = cmd.readRawReply
}
if err := cn.WithReader(c.context(ctx), c.cmdTimeout(cmd), readReplyFunc); err != nil {
if cmd.readTimeout() == nil { if cmd.readTimeout() == nil {
atomic.StoreUint32(&retryTimeout, 1) atomic.StoreUint32(&retryTimeout, 1)
} else { } else {

View file

@ -100,6 +100,7 @@ type RingOptions struct {
DisableIndentity bool DisableIndentity bool
IdentitySuffix string IdentitySuffix string
UnstableResp3 bool
} }
func (opt *RingOptions) init() { func (opt *RingOptions) init() {
@ -168,6 +169,7 @@ func (opt *RingOptions) clientOptions() *Options {
DisableIndentity: opt.DisableIndentity, DisableIndentity: opt.DisableIndentity,
IdentitySuffix: opt.IdentitySuffix, IdentitySuffix: opt.IdentitySuffix,
UnstableResp3: opt.UnstableResp3,
} }
} }

2240
vendor/github.com/redis/go-redis/v9/search_commands.go generated vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -82,6 +82,7 @@ type FailoverOptions struct {
DisableIndentity bool DisableIndentity bool
IdentitySuffix string IdentitySuffix string
UnstableResp3 bool
} }
func (opt *FailoverOptions) clientOptions() *Options { func (opt *FailoverOptions) clientOptions() *Options {
@ -119,6 +120,7 @@ func (opt *FailoverOptions) clientOptions() *Options {
DisableIndentity: opt.DisableIndentity, DisableIndentity: opt.DisableIndentity,
IdentitySuffix: opt.IdentitySuffix, IdentitySuffix: opt.IdentitySuffix,
UnstableResp3: opt.UnstableResp3,
} }
} }
@ -156,6 +158,7 @@ func (opt *FailoverOptions) sentinelOptions(addr string) *Options {
DisableIndentity: opt.DisableIndentity, DisableIndentity: opt.DisableIndentity,
IdentitySuffix: opt.IdentitySuffix, IdentitySuffix: opt.IdentitySuffix,
UnstableResp3: opt.UnstableResp3,
} }
} }

View file

@ -45,13 +45,18 @@ type TSOptions struct {
Encoding string Encoding string
DuplicatePolicy string DuplicatePolicy string
Labels map[string]string Labels map[string]string
IgnoreMaxTimeDiff int64
IgnoreMaxValDiff float64
} }
type TSIncrDecrOptions struct { type TSIncrDecrOptions struct {
Timestamp int64 Timestamp int64
Retention int Retention int
ChunkSize int ChunkSize int
Uncompressed bool Uncompressed bool
DuplicatePolicy string
Labels map[string]string Labels map[string]string
IgnoreMaxTimeDiff int64
IgnoreMaxValDiff float64
} }
type TSAlterOptions struct { type TSAlterOptions struct {
@ -59,6 +64,8 @@ type TSAlterOptions struct {
ChunkSize int ChunkSize int
DuplicatePolicy string DuplicatePolicy string
Labels map[string]string Labels map[string]string
IgnoreMaxTimeDiff int64
IgnoreMaxValDiff float64
} }
type TSCreateRuleOptions struct { type TSCreateRuleOptions struct {
@ -223,6 +230,9 @@ func (c cmdable) TSAddWithArgs(ctx context.Context, key string, timestamp interf
args = append(args, label, value) args = append(args, label, value)
} }
} }
if options.IgnoreMaxTimeDiff != 0 || options.IgnoreMaxValDiff != 0 {
args = append(args, "IGNORE", options.IgnoreMaxTimeDiff, options.IgnoreMaxValDiff)
}
} }
cmd := NewIntCmd(ctx, args...) cmd := NewIntCmd(ctx, args...)
_ = c(ctx, cmd) _ = c(ctx, cmd)
@ -264,6 +274,9 @@ func (c cmdable) TSCreateWithArgs(ctx context.Context, key string, options *TSOp
args = append(args, label, value) args = append(args, label, value)
} }
} }
if options.IgnoreMaxTimeDiff != 0 || options.IgnoreMaxValDiff != 0 {
args = append(args, "IGNORE", options.IgnoreMaxTimeDiff, options.IgnoreMaxValDiff)
}
} }
cmd := NewStatusCmd(ctx, args...) cmd := NewStatusCmd(ctx, args...)
_ = c(ctx, cmd) _ = c(ctx, cmd)
@ -292,6 +305,9 @@ func (c cmdable) TSAlter(ctx context.Context, key string, options *TSAlterOption
args = append(args, label, value) args = append(args, label, value)
} }
} }
if options.IgnoreMaxTimeDiff != 0 || options.IgnoreMaxValDiff != 0 {
args = append(args, "IGNORE", options.IgnoreMaxTimeDiff, options.IgnoreMaxValDiff)
}
} }
cmd := NewStatusCmd(ctx, args...) cmd := NewStatusCmd(ctx, args...)
_ = c(ctx, cmd) _ = c(ctx, cmd)
@ -351,12 +367,18 @@ func (c cmdable) TSIncrByWithArgs(ctx context.Context, key string, timestamp flo
if options.Uncompressed { if options.Uncompressed {
args = append(args, "UNCOMPRESSED") args = append(args, "UNCOMPRESSED")
} }
if options.DuplicatePolicy != "" {
args = append(args, "DUPLICATE_POLICY", options.DuplicatePolicy)
}
if options.Labels != nil { if options.Labels != nil {
args = append(args, "LABELS") args = append(args, "LABELS")
for label, value := range options.Labels { for label, value := range options.Labels {
args = append(args, label, value) args = append(args, label, value)
} }
} }
if options.IgnoreMaxTimeDiff != 0 || options.IgnoreMaxValDiff != 0 {
args = append(args, "IGNORE", options.IgnoreMaxTimeDiff, options.IgnoreMaxValDiff)
}
} }
cmd := NewIntCmd(ctx, args...) cmd := NewIntCmd(ctx, args...)
_ = c(ctx, cmd) _ = c(ctx, cmd)
@ -391,12 +413,18 @@ func (c cmdable) TSDecrByWithArgs(ctx context.Context, key string, timestamp flo
if options.Uncompressed { if options.Uncompressed {
args = append(args, "UNCOMPRESSED") args = append(args, "UNCOMPRESSED")
} }
if options.DuplicatePolicy != "" {
args = append(args, "DUPLICATE_POLICY", options.DuplicatePolicy)
}
if options.Labels != nil { if options.Labels != nil {
args = append(args, "LABELS") args = append(args, "LABELS")
for label, value := range options.Labels { for label, value := range options.Labels {
args = append(args, label, value) args = append(args, label, value)
} }
} }
if options.IgnoreMaxTimeDiff != 0 || options.IgnoreMaxValDiff != 0 {
args = append(args, "IGNORE", options.IgnoreMaxTimeDiff, options.IgnoreMaxValDiff)
}
} }
cmd := NewIntCmd(ctx, args...) cmd := NewIntCmd(ctx, args...)
_ = c(ctx, cmd) _ = c(ctx, cmd)

View file

@ -68,6 +68,7 @@ type UniversalOptions struct {
DisableIndentity bool DisableIndentity bool
IdentitySuffix string IdentitySuffix string
UnstableResp3 bool
} }
// Cluster returns cluster options created from the universal options. // Cluster returns cluster options created from the universal options.
@ -160,6 +161,7 @@ func (o *UniversalOptions) Failover() *FailoverOptions {
DisableIndentity: o.DisableIndentity, DisableIndentity: o.DisableIndentity,
IdentitySuffix: o.IdentitySuffix, IdentitySuffix: o.IdentitySuffix,
UnstableResp3: o.UnstableResp3,
} }
} }
@ -203,6 +205,7 @@ func (o *UniversalOptions) Simple() *Options {
DisableIndentity: o.DisableIndentity, DisableIndentity: o.DisableIndentity,
IdentitySuffix: o.IdentitySuffix, IdentitySuffix: o.IdentitySuffix,
UnstableResp3: o.UnstableResp3,
} }
} }

View file

@ -2,5 +2,5 @@ package redis
// Version is the current release version. // Version is the current release version.
func Version() string { func Version() string {
return "9.6.1" return "9.7.0"
} }

2
vendor/modules.txt vendored
View file

@ -190,7 +190,7 @@ github.com/prometheus/common/model
github.com/prometheus/procfs github.com/prometheus/procfs
github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/fs
github.com/prometheus/procfs/internal/util github.com/prometheus/procfs/internal/util
# github.com/redis/go-redis/v9 v9.6.1 # github.com/redis/go-redis/v9 v9.7.0
## explicit; go 1.18 ## explicit; go 1.18
github.com/redis/go-redis/v9 github.com/redis/go-redis/v9
github.com/redis/go-redis/v9/internal github.com/redis/go-redis/v9/internal