Documentation
¶
Overview ¶
Package valkey is a fast Golang Valkey RESP3 client that does auto pipelining and supports client side caching.
Index ¶
- Constants
- Variables
- func BinaryString(bs []byte) string
- func DecodeSliceOfJSON[T any](result ValkeyResult, dest *[]T) error
- func IsParseErr(err error) bool
- func IsValkeyBusyGroup(err error) bool
- func IsValkeyNil(err error) bool
- func JSON(in any) string
- func JsonMGet(client Client, ctx context.Context, keys []string, path string) (ret map[string]ValkeyMessage, err error)
- func JsonMGetCache(client Client, ctx context.Context, ttl time.Duration, keys []string, ...) (ret map[string]ValkeyMessage, err error)
- func JsonMSet(client Client, ctx context.Context, kvs map[string]string, path string) map[string]error
- func MDel(client Client, ctx context.Context, keys []string) map[string]error
- func MGet(client Client, ctx context.Context, keys []string) (ret map[string]ValkeyMessage, err error)
- func MGetCache(client Client, ctx context.Context, ttl time.Duration, keys []string) (ret map[string]ValkeyMessage, err error)
- func MSet(client Client, ctx context.Context, kvs map[string]string) map[string]error
- func MSetNX(client Client, ctx context.Context, kvs map[string]string) map[string]error
- func ToVector32(s string) []float32
- func ToVector64(s string) []float64
- func VectorString32(v []float32) string
- func VectorString64(v []float64) string
- type AuthCredentials
- type AuthCredentialsContext
- type Builder
- type CacheEntry
- type CacheStore
- type CacheStoreOption
- type Cacheable
- type CacheableTTL
- type Client
- type ClientOption
- type ClusterOption
- type Commands
- type Completed
- type CoreClient
- type DedicatedClient
- type FtSearchDoc
- type GeoLocation
- type Incomplete
- type KeyValues
- type KeyZScores
- type Lua
- type LuaExec
- type MultiValkeyResultStream
- type NewCacheStoreFn
- type PubSubHooks
- type PubSubMessage
- type PubSubSubscription
- type RedirectMode
- type ReplicaInfo
- type RetryDelayFn
- type ScanEntry
- type SentinelOption
- type SimpleCache
- type ValkeyError
- func (r *ValkeyError) Error() string
- func (r *ValkeyError) IsAsk() (addr string, ok bool)
- func (r *ValkeyError) IsBusyGroup() bool
- func (r *ValkeyError) IsClusterDown() bool
- func (r *ValkeyError) IsLoading() bool
- func (r *ValkeyError) IsMoved() (addr string, ok bool)
- func (r *ValkeyError) IsNil() bool
- func (r *ValkeyError) IsNoScript() bool
- func (r *ValkeyError) IsTryAgain() bool
- type ValkeyMessage
- func (m *ValkeyMessage) AsBool() (val bool, err error)
- func (m *ValkeyMessage) AsBoolSlice() ([]bool, error)
- func (m *ValkeyMessage) AsBytes() (bs []byte, err error)
- func (m *ValkeyMessage) AsFloat64() (val float64, err error)
- func (m *ValkeyMessage) AsFloatSlice() ([]float64, error)
- func (m *ValkeyMessage) AsFtAggregate() (total int64, docs []map[string]string, err error)
- func (m *ValkeyMessage) AsFtAggregateCursor() (cursor, total int64, docs []map[string]string, err error)
- func (m *ValkeyMessage) AsFtSearch() (total int64, docs []FtSearchDoc, err error)
- func (m *ValkeyMessage) AsGeosearch() ([]GeoLocation, error)
- func (m *ValkeyMessage) AsInt64() (val int64, err error)
- func (m *ValkeyMessage) AsIntMap() (map[string]int64, error)
- func (m *ValkeyMessage) AsIntSlice() ([]int64, error)
- func (m *ValkeyMessage) AsLMPop() (kvs KeyValues, err error)
- func (m *ValkeyMessage) AsMap() (map[string]ValkeyMessage, error)
- func (m *ValkeyMessage) AsReader() (reader io.Reader, err error)
- func (m *ValkeyMessage) AsScanEntry() (e ScanEntry, err error)
- func (m *ValkeyMessage) AsStrMap() (map[string]string, error)
- func (m *ValkeyMessage) AsStrSlice() ([]string, error)
- func (m *ValkeyMessage) AsUint64() (val uint64, err error)
- func (m *ValkeyMessage) AsXRange() ([]XRangeEntry, error)
- func (m *ValkeyMessage) AsXRangeEntry() (XRangeEntry, error)
- func (m *ValkeyMessage) AsXRead() (ret map[string][]XRangeEntry, err error)
- func (m *ValkeyMessage) AsZMPop() (kvs KeyZScores, err error)
- func (m *ValkeyMessage) AsZScore() (s ZScore, err error)
- func (m *ValkeyMessage) AsZScores() ([]ZScore, error)
- func (m *ValkeyMessage) CacheMarshal(buf []byte) []byte
- func (m *ValkeyMessage) CachePTTL() int64
- func (m *ValkeyMessage) CachePXAT() int64
- func (m *ValkeyMessage) CacheSize() int
- func (m *ValkeyMessage) CacheTTL() (ttl int64)
- func (m *ValkeyMessage) CacheUnmarshalView(buf []byte) error
- func (m *ValkeyMessage) DecodeJSON(v any) (err error)
- func (m *ValkeyMessage) Error() error
- func (m *ValkeyMessage) IsArray() bool
- func (m *ValkeyMessage) IsBool() bool
- func (m *ValkeyMessage) IsCacheHit() bool
- func (m *ValkeyMessage) IsFloat64() bool
- func (m *ValkeyMessage) IsInt64() bool
- func (m *ValkeyMessage) IsMap() bool
- func (m *ValkeyMessage) IsNil() bool
- func (m *ValkeyMessage) IsString() bool
- func (m *ValkeyMessage) String() string
- func (m *ValkeyMessage) ToAny() (any, error)
- func (m *ValkeyMessage) ToArray() ([]ValkeyMessage, error)
- func (m *ValkeyMessage) ToBool() (val bool, err error)
- func (m *ValkeyMessage) ToFloat64() (val float64, err error)
- func (m *ValkeyMessage) ToInt64() (val int64, err error)
- func (m *ValkeyMessage) ToMap() (map[string]ValkeyMessage, error)
- func (m *ValkeyMessage) ToString() (val string, err error)
- type ValkeyResult
- func (r ValkeyResult) AsBool() (v bool, err error)
- func (r ValkeyResult) AsBoolSlice() (v []bool, err error)
- func (r ValkeyResult) AsBytes() (v []byte, err error)
- func (r ValkeyResult) AsFloat64() (v float64, err error)
- func (r ValkeyResult) AsFloatSlice() (v []float64, err error)
- func (r ValkeyResult) AsFtAggregate() (total int64, docs []map[string]string, err error)
- func (r ValkeyResult) AsFtAggregateCursor() (cursor, total int64, docs []map[string]string, err error)
- func (r ValkeyResult) AsFtSearch() (total int64, docs []FtSearchDoc, err error)
- func (r ValkeyResult) AsGeosearch() (locations []GeoLocation, err error)
- func (r ValkeyResult) AsInt64() (v int64, err error)
- func (r ValkeyResult) AsIntMap() (v map[string]int64, err error)
- func (r ValkeyResult) AsIntSlice() (v []int64, err error)
- func (r ValkeyResult) AsLMPop() (v KeyValues, err error)
- func (r ValkeyResult) AsMap() (v map[string]ValkeyMessage, err error)
- func (r ValkeyResult) AsReader() (v io.Reader, err error)
- func (r ValkeyResult) AsScanEntry() (v ScanEntry, err error)
- func (r ValkeyResult) AsStrMap() (v map[string]string, err error)
- func (r ValkeyResult) AsStrSlice() (v []string, err error)
- func (r ValkeyResult) AsUint64() (v uint64, err error)
- func (r ValkeyResult) AsXRange() (v []XRangeEntry, err error)
- func (r ValkeyResult) AsXRangeEntry() (v XRangeEntry, err error)
- func (r ValkeyResult) AsXRead() (v map[string][]XRangeEntry, err error)
- func (r ValkeyResult) AsZMPop() (v KeyZScores, err error)
- func (r ValkeyResult) AsZScore() (v ZScore, err error)
- func (r ValkeyResult) AsZScores() (v []ZScore, err error)
- func (r ValkeyResult) CachePTTL() int64
- func (r ValkeyResult) CachePXAT() int64
- func (r ValkeyResult) CacheTTL() int64
- func (r ValkeyResult) DecodeJSON(v any) (err error)
- func (r ValkeyResult) Error() (err error)
- func (r ValkeyResult) IsCacheHit() bool
- func (r ValkeyResult) NonValkeyError() error
- func (r *ValkeyResult) String() string
- func (r ValkeyResult) ToAny() (v any, err error)
- func (r ValkeyResult) ToArray() (v []ValkeyMessage, err error)
- func (r ValkeyResult) ToBool() (v bool, err error)
- func (r ValkeyResult) ToFloat64() (v float64, err error)
- func (r ValkeyResult) ToInt64() (v int64, err error)
- func (r ValkeyResult) ToMap() (v map[string]ValkeyMessage, err error)
- func (r ValkeyResult) ToMessage() (v ValkeyMessage, err error)
- func (r ValkeyResult) ToString() (v string, err error)
- type ValkeyResultStream
- type XRangeEntry
- type ZScore
Examples ¶
Constants ¶
const ( // DefaultCacheBytes is the default value of ClientOption.CacheSizeEachConn, which is 128 MiB DefaultCacheBytes = 128 * (1 << 20) // DefaultRingScale is the default value of ClientOption.RingScaleEachConn, which results into having a ring of size 2^10 for each connection DefaultRingScale = 10 // DefaultPoolSize is the default value of ClientOption.BlockingPoolSize DefaultPoolSize = 1024 // DefaultBlockingPipeline is the default value of ClientOption.BlockingPipeline DefaultBlockingPipeline = 2000 // DefaultDialTimeout is the default value of ClientOption.Dialer.Timeout DefaultDialTimeout = 5 * time.Second // DefaultTCPKeepAlive is the default value of ClientOption.Dialer.KeepAlive DefaultTCPKeepAlive = 1 * time.Second // DefaultReadBuffer is the default value of bufio.NewReaderSize for each connection, which is 0.5MiB DefaultReadBuffer = 1 << 19 // DefaultWriteBuffer is the default value of bufio.NewWriterSize for each connection, which is 0.5MiB DefaultWriteBuffer = 1 << 19 // MaxPipelineMultiplex is the maximum meaningful value for ClientOption.PipelineMultiplex MaxPipelineMultiplex = 8 )
const LibName = "valkey"
const LibVer = "1.0.55"
Variables ¶
var ( // ErrClosing means the Client.Close had been called ErrClosing = errors.New("valkey client is closing or unable to connect valkey") // ErrNoAddr means the ClientOption.InitAddress is empty ErrNoAddr = errors.New("no alive address in InitAddress") // ErrNoCache means your valkey does not support client-side caching and must set ClientOption.DisableCache to true ErrNoCache = errors.New("ClientOption.DisableCache must be true for valkey not supporting client-side caching or not supporting RESP3") // ErrRESP2PubSubMixed means your valkey does not support RESP3 and valkey can't handle SUBSCRIBE/PSUBSCRIBE/SSUBSCRIBE in mixed case ErrRESP2PubSubMixed = errors.New("valkey does not support SUBSCRIBE/PSUBSCRIBE/SSUBSCRIBE mixed with other commands in RESP2") // ErrBlockingPubSubMixed valkey can't handle SUBSCRIBE/PSUBSCRIBE/SSUBSCRIBE mixed with other blocking commands ErrBlockingPubSubMixed = errors.New("valkey does not support SUBSCRIBE/PSUBSCRIBE/SSUBSCRIBE mixed with other blocking commands") // ErrDoCacheAborted means valkey abort EXEC request or connection closed ErrDoCacheAborted = errors.New("failed to fetch the cache because EXEC was aborted by valkey or connection closed") // ErrReplicaOnlyNotSupported means ReplicaOnly flag is not supported by // current client ErrReplicaOnlyNotSupported = errors.New("ReplicaOnly is not supported for single client") // ErrWrongPipelineMultiplex means wrong value for ClientOption.PipelineMultiplex ErrWrongPipelineMultiplex = errors.New("ClientOption.PipelineMultiplex must not be bigger than MaxPipelineMultiplex") // ErrDedicatedClientRecycled means the caller attempted to use the dedicated client which has been already recycled (after canceled/closed). ErrDedicatedClientRecycled = errors.New("dedicated client should not be used after recycled") // DisableClientSetInfo is the value that can be used for ClientOption.ClientSetInfo to disable making the CLIENT SETINFO command DisableClientSetInfo = make([]string, 0) )
var ErrCacheUnmarshal = errors.New("cache unmarshal error")
var ErrInvalidShardsRefreshInterval = errors.New("ShardsRefreshInterval must be greater than or equal to 0")
var ErrMSetNXNotSet = errors.New("MSETNX: no key was set")
ErrMSetNXNotSet is used in the MSetNX helper when the underlying MSETNX response is 0. Ref: https://redis.io/commands/msetnx/
var ErrNoSlot = errors.New("the slot has no valkey node")
ErrNoSlot indicates that there is no valkey node owns the key slot.
var ErrReplicaOnlyConflict = errors.New("ReplicaOnly conflicts with SendToReplicas option")
var ErrReplicaOnlyConflictWithReplicaSelector = errors.New("ReplicaOnly conflicts with ReplicaSelector option")
var ErrSendToReplicasNotSet = errors.New("SendToReplicas must be set when ReplicaSelector is set")
var Nil = &ValkeyError{typ: typeNull}
Nil represents a Valkey Nil message
Functions ¶
func BinaryString ¶
BinaryString convert the provided []byte into a string without copy. It does what strings.Builder.String() does. Valkey Strings are binary safe, this means that it is safe to store any []byte into Valkey directly. Users can use this BinaryString helper to insert a []byte as the part of valkey command. For example:
client.B().Set().Key(valkey.BinaryString([]byte{0})).Value(valkey.BinaryString([]byte{0})).Build()
To read back the []byte of the string returned from the Valkey, it is recommended to use the ValkeyMessage.AsReader.
func DecodeSliceOfJSON ¶
func DecodeSliceOfJSON[T any](result ValkeyResult, dest *[]T) error
DecodeSliceOfJSON is a helper that struct-scans each ValkeyMessage into dest, which must be a slice of pointer.
func IsParseErr ¶ added in v1.0.40
IsParseErr checks if the error is a parse error
func IsValkeyBusyGroup ¶
IsValkeyBusyGroup checks if it is a valkey BUSYGROUP message.
func IsValkeyNil ¶
IsValkeyNil is a handy method to check if error is a valkey nil response. All valkey nil response returns as an error.
Example ¶
client, err := NewClient(ClientOption{InitAddress: []string{"127.0.0.1:6379"}}) if err != nil { panic(err) } defer client.Close() _, err = client.Do(context.Background(), client.B().Get().Key("not_exists").Build()).ToString() if err != nil && IsValkeyNil(err) { fmt.Printf("it is a nil response") }
Output:
func JSON ¶
JSON convert the provided parameter into a JSON string. Users can use this JSON helper to work with RedisJSON commands. For example:
client.B().JsonSet().Key("a").Path("$.myField").Value(valkey.JSON("str")).Build()
func JsonMGet ¶
func JsonMGet(client Client, ctx context.Context, keys []string, path string) (ret map[string]ValkeyMessage, err error)
JsonMGet is a helper that consults valkey directly with multiple keys by grouping keys within same slot into JSON.MGETs or multiple JSON.GETs
func JsonMGetCache ¶
func JsonMGetCache(client Client, ctx context.Context, ttl time.Duration, keys []string, path string) (ret map[string]ValkeyMessage, err error)
JsonMGetCache is a helper that consults the client-side caches with multiple keys by grouping keys within same slot into multiple JSON.GETs
func JsonMSet ¶
func JsonMSet(client Client, ctx context.Context, kvs map[string]string, path string) map[string]error
JsonMSet is a helper that consults valkey directly with multiple keys by grouping keys within same slot into JSON.MSETs or multiple JOSN.SETs
func MDel ¶
MDel is a helper that consults the valkey directly with multiple keys by grouping keys within same slot into DELs
func MGet ¶
func MGet(client Client, ctx context.Context, keys []string) (ret map[string]ValkeyMessage, err error)
MGet is a helper that consults the valkey directly with multiple keys by grouping keys within same slot into MGET or multiple GETs
func MGetCache ¶
func MGetCache(client Client, ctx context.Context, ttl time.Duration, keys []string) (ret map[string]ValkeyMessage, err error)
MGetCache is a helper that consults the client-side caches with multiple keys by grouping keys within same slot into multiple GETs
func MSet ¶
MSet is a helper that consults the valkey directly with multiple keys by grouping keys within same slot into MSETs or multiple SETs
func MSetNX ¶
MSetNX is a helper that consults the valkey directly with multiple keys by grouping keys within same slot into MSETNXs or multiple SETNXs
func ToVector32 ¶
ToVector32 reverts VectorString32. User can use this to convert valkey response back to []float32.
func ToVector64 ¶
ToVector64 reverts VectorString64. User can use this to convert valkey response back to []float64.
func VectorString32 ¶
VectorString32 convert the provided []float32 into a string. Users can use this to build vector search queries:
client.B().FtSearch().Index("idx").Query("*=>[KNN 5 @vec $V]"). Params().Nargs(2).NameValue().NameValue("V", valkey.VectorString32([]float32{1})). Dialect(2).Build()
func VectorString64 ¶
VectorString64 convert the provided []float64 into a string. Users can use this to build vector search queries:
client.B().FtSearch().Index("idx").Query("*=>[KNN 5 @vec $V]"). Params().Nargs(2).NameValue().NameValue("V", valkey.VectorString64([]float64{1})). Dialect(2).Build()
Types ¶
type AuthCredentials ¶
AuthCredentials is the output of AuthCredentialsFn
type AuthCredentialsContext ¶
AuthCredentialsContext is the parameter container of AuthCredentialsFn
type Builder ¶
Builder represents a command builder. It should only be created from the client.B() method.
type CacheEntry ¶
type CacheEntry interface {
Wait(ctx context.Context) (ValkeyMessage, error)
}
CacheEntry should be used to wait for single-flight response when cache missed.
type CacheStore ¶
type CacheStore interface { // Flight is called when DoCache and DoMultiCache, with the requested client side ttl and the current time. // It should look up the store in single-flight manner and return one of the following three combinations: // Case 1: (empty ValkeyMessage, nil CacheEntry) <- when cache missed, and valkey will send the request to valkey. // Case 2: (empty ValkeyMessage, non-nil CacheEntry) <- when cache missed, and valkey will use CacheEntry.Wait to wait for response. // Case 3: (non-empty ValkeyMessage, nil CacheEntry) <- when cache hit Flight(key, cmd string, ttl time.Duration, now time.Time) (v ValkeyMessage, e CacheEntry) // Update is called when receiving the response of the request sent by the above Flight Case 1 from valkey. // It should not only update the store but also deliver the response to all CacheEntry.Wait and return a desired client side PXAT of the response. // Note that the server side expire time can be retrieved from ValkeyMessage.CachePXAT. Update(key, cmd string, val ValkeyMessage) (pxat int64) // Cancel is called when the request sent by the above Flight Case 1 failed. // It should not only deliver the error to all CacheEntry.Wait but also remove the CacheEntry from the store. Cancel(key, cmd string, err error) // Delete is called when receiving invalidation notifications from valkey. // If the keys is nil then it should delete all non-pending cached entries under all keys. // If the keys is not nil then it should delete all non-pending cached entries under those keys. Delete(keys []ValkeyMessage) // Close is called when connection between valkey is broken. // It should flush all cached entries and deliver the error to all pending CacheEntry.Wait. Close(err error) }
CacheStore is the store interface for the client side caching More detailed interface requirement can be found in cache_test.go
func NewSimpleCacheAdapter ¶
func NewSimpleCacheAdapter(store SimpleCache) CacheStore
NewSimpleCacheAdapter converts a SimpleCache into CacheStore
type CacheStoreOption ¶
type CacheStoreOption struct { // CacheSizeEachConn is valkey client side cache size that bind to each TCP connection to a single valkey instance. // The default is DefaultCacheBytes. CacheSizeEachConn int }
CacheStoreOption will be passed to NewCacheStoreFn
type Cacheable ¶
Cacheable represents a completed Valkey command which supports server-assisted client side caching, and it should be created by the Cache() of command builder.
type CacheableTTL ¶
CacheableTTL is parameter container of DoMultiCache
type Client ¶
type Client interface { CoreClient // DoCache is similar to Do, but it uses opt-in client side caching and requires a client side TTL. // The explicit client side TTL specifies the maximum TTL on the client side. // If the key's TTL on the server is smaller than the client side TTL, the client side TTL will be capped. // client.Do(ctx, client.B().Get().Key("k").Cache(), time.Minute).ToString() // The above example will send the following command to valkey if cache miss: // CLIENT CACHING YES // PTTL k // GET k // The in-memory cache size is configured by ClientOption.CacheSizeEachConn. // The cmd parameter is recycled after passing into DoCache() and should not be reused. DoCache(ctx context.Context, cmd Cacheable, ttl time.Duration) (resp ValkeyResult) // DoMultiCache is similar to DoCache, but works with multiple cacheable commands across different slots. // It will first group commands by slots and will send only cache missed commands to valkey. DoMultiCache(ctx context.Context, multi ...CacheableTTL) (resp []ValkeyResult) // DoStream send a command to valkey through a dedicated connection acquired from a connection pool. // It returns a ValkeyResultStream, but it does not read the command response until the ValkeyResultStream.WriteTo is called. // After the ValkeyResultStream.WriteTo is called, the underlying connection is then recycled. // DoStream should only be used when you want to stream valkey response directly to an io.Writer without additional allocation, // otherwise, the normal Do() should be used instead. // Also note that DoStream can only work with commands returning string, integer, or float response. DoStream(ctx context.Context, cmd Completed) ValkeyResultStream // DoMultiStream is similar to DoStream, but pipelines multiple commands to valkey. // It returns a MultiValkeyResultStream, and users should call MultiValkeyResultStream.WriteTo as many times as the number of commands sequentially // to read each command response from valkey. After all responses are read, the underlying connection is then recycled. // DoMultiStream should only be used when you want to stream valkey responses directly to an io.Writer without additional allocation, // otherwise, the normal DoMulti() should be used instead. // DoMultiStream does not support multiple key slots when connecting to a valkey cluster. DoMultiStream(ctx context.Context, multi ...Completed) MultiValkeyResultStream // Dedicated acquire a connection from the blocking connection pool, no one else can use the connection // during Dedicated. The main usage of Dedicated is CAS operation, which is WATCH + MULTI + EXEC. // However, one should try to avoid CAS operation but use Lua script instead, because occupying a connection // is not good for performance. Dedicated(fn func(DedicatedClient) error) (err error) // Dedicate does the same as Dedicated, but it exposes DedicatedClient directly // and requires user to invoke cancel() manually to put connection back to the pool. Dedicate() (client DedicatedClient, cancel func()) // Nodes returns each valkey node this client known as valkey.Client. This is useful if you want to // send commands to some specific valkey nodes in the cluster. Nodes() map[string]Client }
Client is the valkey client interface for both single valkey instance and valkey cluster. It should be created from the NewClient()
Example (DedicateCAS) ¶
client, err := NewClient(ClientOption{InitAddress: []string{"127.0.0.1:6379"}}) if err != nil { panic(err) } defer client.Close() c, cancel := client.Dedicate() defer cancel() ctx := context.Background() // watch keys first if err := c.Do(ctx, c.B().Watch().Key("k1", "k2").Build()).Error(); err != nil { panic(err) } // perform read here values, err := c.Do(ctx, c.B().Mget().Key("k1", "k2").Build()).ToArray() if err != nil { panic(err) } v1, _ := values[0].ToString() v2, _ := values[1].ToString() // perform write with MULTI EXEC for _, resp := range c.DoMulti( ctx, c.B().Multi().Build(), c.B().Set().Key("k1").Value(v1+"1").Build(), c.B().Set().Key("k2").Value(v2+"2").Build(), c.B().Exec().Build(), ) { if err := resp.Error(); err != nil { panic(err) } }
Output:
Example (DedicatedCAS) ¶
client, err := NewClient(ClientOption{InitAddress: []string{"127.0.0.1:6379"}}) if err != nil { panic(err) } defer client.Close() ctx := context.Background() client.Dedicated(func(client DedicatedClient) error { // watch keys first if err := client.Do(ctx, client.B().Watch().Key("k1", "k2").Build()).Error(); err != nil { return err } // perform read here values, err := client.Do(ctx, client.B().Mget().Key("k1", "k2").Build()).ToArray() if err != nil { return err } v1, _ := values[0].ToString() v2, _ := values[1].ToString() // perform write with MULTI EXEC for _, resp := range client.DoMulti( ctx, client.B().Multi().Build(), client.B().Set().Key("k1").Value(v1+"1").Build(), client.B().Set().Key("k2").Value(v2+"2").Build(), client.B().Exec().Build(), ) { if err := resp.Error(); err != nil { return err } } return nil })
Output:
Example (Do) ¶
client, err := NewClient(ClientOption{InitAddress: []string{"127.0.0.1:6379"}}) if err != nil { panic(err) } defer client.Close() ctx := context.Background() client.Do(ctx, client.B().Set().Key("k").Value("1").Build()).Error() client.Do(ctx, client.B().Get().Key("k").Build()).ToString() client.Do(ctx, client.B().Get().Key("k").Build()).AsInt64() client.Do(ctx, client.B().Hmget().Key("h").Field("a", "b").Build()).ToArray() client.Do(ctx, client.B().Scard().Key("s").Build()).ToInt64() client.Do(ctx, client.B().Smembers().Key("s").Build()).AsStrSlice()
Output:
Example (DoCache) ¶
client, err := NewClient(ClientOption{InitAddress: []string{"127.0.0.1:6379"}}) if err != nil { panic(err) } defer client.Close() ctx := context.Background() client.DoCache(ctx, client.B().Get().Key("k").Cache(), time.Minute).ToString() client.DoCache(ctx, client.B().Get().Key("k").Cache(), time.Minute).AsInt64() client.DoCache(ctx, client.B().Hmget().Key("h").Field("a", "b").Cache(), time.Minute).ToArray() client.DoCache(ctx, client.B().Scard().Key("s").Cache(), time.Minute).ToInt64() client.DoCache(ctx, client.B().Smembers().Key("s").Cache(), time.Minute).AsStrSlice()
Output:
Example (Scan) ¶
client, err := NewClient(ClientOption{InitAddress: []string{"127.0.0.1:6379"}}) if err != nil { panic(err) } defer client.Close() for _, c := range client.Nodes() { // loop over all your valkey nodes var scan ScanEntry for more := true; more; more = scan.Cursor != 0 { if scan, err = c.Do(context.Background(), c.B().Scan().Cursor(scan.Cursor).Build()).AsScanEntry(); err != nil { panic(err) } fmt.Println(scan.Elements) } }
Output:
func NewClient ¶
func NewClient(option ClientOption) (client Client, err error)
NewClient uses ClientOption to initialize the Client for both cluster client and single client. It will first try to connect as cluster client. If the len(ClientOption.InitAddress) == 1 and the address does not enable cluster mode, the NewClient() will use single client instead.
Example (Cluster) ¶
client, _ := NewClient(ClientOption{ InitAddress: []string{"127.0.0.1:7001", "127.0.0.1:7002", "127.0.0.1:7003"}, ShuffleInit: true, }) defer client.Close()
Output:
Example (Sentinel) ¶
client, _ := NewClient(ClientOption{ InitAddress: []string{"127.0.0.1:26379", "127.0.0.1:26380", "127.0.0.1:26381"}, Sentinel: SentinelOption{ MasterSet: "my_master", }, }) defer client.Close()
Output:
Example (Single) ¶
client, _ := NewClient(ClientOption{ InitAddress: []string{"127.0.0.1:6379"}, }) defer client.Close()
Output:
type ClientOption ¶
type ClientOption struct { TLSConfig *tls.Config // DialFn allows for a custom function to be used to create net.Conn connections DialFn func(string, *net.Dialer, *tls.Config) (conn net.Conn, err error) // NewCacheStoreFn allows a custom client side caching store for each connection NewCacheStoreFn NewCacheStoreFn // OnInvalidations is a callback function in case of client-side caching invalidation received. // Note that this function must be fast, otherwise other valkey messages will be blocked. OnInvalidations func([]ValkeyMessage) // SendToReplicas is a function that returns true if the command should be sent to replicas. // currently only used for cluster client. // NOTE: This function can't be used with ReplicaOnly option. SendToReplicas func(cmd Completed) bool // AuthCredentialsFn allows for setting the AUTH username and password dynamically on each connection attempt to // support rotating credentials AuthCredentialsFn func(AuthCredentialsContext) (AuthCredentials, error) // RetryDelay is the function that returns the delay that should be used before retrying the attempt. // The default is an exponential backoff with a maximum delay of 1 second. // Only used when DisableRetry is false. RetryDelay RetryDelayFn // ReplicaSelector selects a replica node when `SendToReplicas` returns true. // If the function is set, the client will send selected command to the replica node. // Returned value is the index of the replica node in the replicas slice. // If the returned value is out of range, the primary node will be selected. // If primary node does not have any replica, the primary node will be selected // and function will not be called. // Currently only used for cluster client. // Each ReplicaInfo must not be modified. // NOTE: This function can't be used with ReplicaOnly option. // NOTE: This function must be used with SendToReplicas function. ReplicaSelector func(slot uint16, replicas []ReplicaInfo) int // Sentinel options, including MasterSet and Auth options Sentinel SentinelOption // TCP & TLS // Dialer can be used to customized how valkey-go connect to a valkey instance via TCP, including: // - Timeout, the default is DefaultDialTimeout // - KeepAlive, the default is DefaultTCPKeepAlive // The Dialer.KeepAlive interval is used to detect an unresponsive idle tcp connection. // OS takes at least (tcp_keepalive_probes+1)*Dialer.KeepAlive time to conclude an idle connection to be unresponsive. // For example: DefaultTCPKeepAlive = 1s and the default of tcp_keepalive_probes on Linux is 9. // Therefore, it takes at least 10s to kill an idle and unresponsive tcp connection on Linux by default. Dialer net.Dialer // Valkey AUTH parameters Username string Password string ClientName string // ClientSetInfo will assign various info attributes to the current connection. // Note that ClientSetInfo should have exactly 2 values, the lib name and the lib version respectively. ClientSetInfo []string // InitAddress point to valkey nodes. // Valkey will connect to them one by one and issue CLUSTER SLOT command to initialize the cluster client until success. // If len(InitAddress) == 1 and the address is not running in cluster mode, valkey will fall back to the single client mode. // If ClientOption.Sentinel.MasterSet is set, then InitAddress will be used to connect sentinels // You can bypass this behaviour by using ClientOption.ForceSingleClient. InitAddress []string // ClientTrackingOptions will be appended to CLIENT TRACKING ON command when the connection is established. // The default is []string{"OPTIN"} ClientTrackingOptions []string SelectDB int // CacheSizeEachConn is valkey client side cache size that bind to each TCP connection to a single valkey instance. // The default is DefaultCacheBytes. CacheSizeEachConn int // RingScaleEachConn sets the size of the ring buffer in each connection to (2 ^ RingScaleEachConn). // The default is RingScaleEachConn, which results into having a ring of size 2^10 for each connection. // Reduce this value can reduce the memory consumption of each connection at the cost of potential throughput degradation. // Values smaller than 8 is typically not recommended. RingScaleEachConn int // ReadBufferEachConn is the size of the bufio.NewReaderSize for each connection, default to DefaultReadBuffer (0.5 MiB). ReadBufferEachConn int // WriteBufferEachConn is the size of the bufio.NewWriterSize for each connection, default to DefaultWriteBuffer (0.5 MiB). WriteBufferEachConn int // BlockingPoolCleanup is the duration for cleaning up idle connections. // If BlockingPoolCleanup is 0, then idle connections will not be cleaned up. BlockingPoolCleanup time.Duration // BlockingPoolMinSize is the minimum size of the connection pool // shared by blocking commands (ex BLPOP, XREAD with BLOCK). // Only relevant if BlockingPoolCleanup is not 0. This parameter limits // the number of idle connections that can be removed by BlockingPoolCleanup. BlockingPoolMinSize int // BlockingPoolSize is the size of the connection pool shared by blocking commands (ex BLPOP, XREAD with BLOCK). // The default is DefaultPoolSize. BlockingPoolSize int // BlockingPipeline is the threshold of a pipeline that will be treated as blocking commands when exceeding it. BlockingPipeline int // PipelineMultiplex determines how many tcp connections used to pipeline commands to one valkey instance. // The default for single and sentinel clients is 2, which means 4 connections (2^2). // The default for cluster clients is 0, which means 1 connection (2^0). PipelineMultiplex int // ConnWriteTimeout is read/write timeout for each connection. If specified, // it is used to control the maximum duration waits for responses to pipeline commands. // Also, ConnWriteTimeout is applied net.Conn.SetDeadline and periodic PING to valkey // Since the Dialer.KeepAlive will not be triggered if there is data in the outgoing buffer, // ConnWriteTimeout should be set in order to detect local congestion or unresponsive valkey server. // This default is ClientOption.Dialer.KeepAlive * (9+1), where 9 is the default of tcp_keepalive_probes on Linux. ConnWriteTimeout time.Duration // MaxFlushDelay when greater than zero pauses pipeline write loop for some time (not larger than MaxFlushDelay) // after each flushing of data to the connection. This gives pipeline a chance to collect more commands to send // to Valkey. Adding this delay increases latency, reduces throughput – but in most cases may significantly reduce // application and Valkey CPU utilization due to less executed system calls. By default, Valkey flushes data to the // connection without extra delays. Depending on network latency and application-specific conditions the value // of MaxFlushDelay may vary, sth like 20 microseconds should not affect latency/throughput a lot but still // produce notable CPU usage reduction under load. Ref: https://github.com/redis/rueidis/issues/156 MaxFlushDelay time.Duration // ClusterOption is the options for the valkey cluster client. ClusterOption ClusterOption // DisableTCPNoDelay turns on Nagle's algorithm in pipelining mode by using conn.SetNoDelay(false). // Turning this on can result in lower p99 latencies and lower CPU usages if all your requests are small. // But if you have large requests or fast network, this might degrade the performance. Ref: https://github.com/redis/rueidis/pull/650 DisableTCPNoDelay bool // ShuffleInit is a handy flag that shuffles the InitAddress after passing to the NewClient() if it is true ShuffleInit bool // ClientNoTouch controls whether commands alter LRU/LFU stats ClientNoTouch bool // DisableRetry disables retrying read-only commands under network errors DisableRetry bool // DisableCache falls back Client.DoCache/Client.DoMultiCache to Client.Do/Client.DoMulti DisableCache bool // DisableAutoPipelining makes valkey.Client always pick a connection from the BlockingPool to serve each request. DisableAutoPipelining bool // AlwaysPipelining makes valkey.Client always pipeline valkey commands even if they are not issued concurrently. AlwaysPipelining bool // AlwaysRESP2 makes valkey.Client always uses RESP2, otherwise it will try using RESP3 first. AlwaysRESP2 bool // ForceSingleClient force the usage of a single client connection, without letting the lib guessing // if valkey instance is a cluster or a single valkey instance. ForceSingleClient bool // ReplicaOnly indicates that this client will only try to connect to readonly replicas of valkey setup. ReplicaOnly bool // ClientNoEvict sets the client eviction mode for the current connection. // When turned on and client eviction is configured, // the current connection will be excluded from the client eviction process // even if we're above the configured client eviction threshold. ClientNoEvict bool // EnableReplicaAZInfo enables the client to load the replica node's availability zone. // If true, the client will set the `AZ` field in `ReplicaInfo`. EnableReplicaAZInfo bool }
ClientOption should be passed to NewClient to construct a Client
func MustParseURL ¶
func MustParseURL(str string) ClientOption
func ParseURL ¶
func ParseURL(str string) (opt ClientOption, err error)
ParseURL parses a valkey URL into ClientOption. https://github.com/redis/redis-specifications/blob/master/uri/redis.txt Example:
redis://<user>:<password>@<host>:<port>/<db_number> redis://<user>:<password>@<host>:<port>?addr=<host2>:<port2>&addr=<host3>:<port3> unix://<user>:<password>@</path/to/redis.sock>?db=<db_number>
type ClusterOption ¶ added in v1.0.47
type ClusterOption struct { // ShardsRefreshInterval is the interval to scan the cluster topology. // If the value is zero, refreshment will be disabled. // Cluster topology cache refresh happens always in the background after successful scan. ShardsRefreshInterval time.Duration }
ClusterOption is the options for the valkey cluster client.
type Commands ¶
type Commands []Completed
Commands is an exported alias to []Completed. This allows users to store commands for later usage, for example:
c, release := client.Dedicate() defer release() cmds := make(valkey.Commands, 0, 10) for i := 0; i < 10; i++ { cmds = append(cmds, c.B().Set().Key(strconv.Itoa(i)).Value(strconv.Itoa(i)).Build()) } for _, resp := range c.DoMulti(ctx, cmds...) { if err := resp.Error(); err != nil { panic(err) }
However, please know that once commands are processed by the Do() or DoMulti(), they are recycled and should not be reused.
type Completed ¶
Completed represents a completed Valkey command. It should only be created from the Build() of a command builder.
type CoreClient ¶
type CoreClient interface { // B is the getter function to the command builder for the client // If the client is a cluster client, the command builder also prohibits cross key slots in one command. B() Builder // Do is the method sending user's valkey command building from the B() to a valkey node. // client.Do(ctx, client.B().Get().Key("k").Build()).ToString() // All concurrent non-blocking commands will be pipelined automatically and have better throughput. // Blocking commands will use another separated connection pool. // The cmd parameter is recycled after passing into Do() and should not be reused. Do(ctx context.Context, cmd Completed) (resp ValkeyResult) // DoMulti takes multiple valkey commands and sends them together, reducing RTT from the user code. // The multi parameters are recycled after passing into DoMulti() and should not be reused. DoMulti(ctx context.Context, multi ...Completed) (resp []ValkeyResult) // Receive accepts SUBSCRIBE, SSUBSCRIBE, PSUBSCRIBE command and a message handler. // Receive will block and then return value only when the following cases: // 1. return nil when received any unsubscribe/punsubscribe message related to the provided `subscribe` command. // 2. return ErrClosing when the client is closed manually. // 3. return ctx.Err() when the `ctx` is done. // 4. return non-nil err when the provided `subscribe` command failed. Receive(ctx context.Context, subscribe Completed, fn func(msg PubSubMessage)) error // Close will make further calls to the client be rejected with ErrClosing, // and Close will wait until all pending calls finished. Close() }
CoreClient is the minimum interface shared by the Client and the DedicatedClient.
type DedicatedClient ¶
type DedicatedClient interface { CoreClient // SetPubSubHooks is an alternative way to processing Pub/Sub messages instead of using Receive. // SetPubSubHooks is non-blocking and allows users to subscribe/unsubscribe channels later. // Note that the hooks will be called sequentially but in another goroutine. // The return value will be either: // 1. an error channel, if the hooks passed in is not zero, or // 2. nil, if the hooks passed in is zero. (used for reset hooks) // In the former case, the error channel is guaranteed to be close when the hooks will not be called anymore, // and has at most one error describing the reason why the hooks will not be called anymore. // Users can use the error channel to detect disconnection. SetPubSubHooks(hooks PubSubHooks) <-chan error }
DedicatedClient is obtained from Client.Dedicated() and it will be bound to single valkey connection and no other commands can be pipelined in to this connection during Client.Dedicated(). If the DedicatedClient is obtained from cluster client, the first command to it must have a Key() to identify the valkey node.
type GeoLocation ¶
type Incomplete ¶
type Incomplete = cmds.Incomplete
Incomplete represents an incomplete Valkey command. It should then be completed by calling the Build().
type KeyZScores ¶
type Lua ¶
type Lua struct {
// contains filtered or unexported fields
}
Lua represents a valkey lua script. It should be created from the NewLuaScript() or NewLuaScriptReadOnly()
Example (Exec) ¶
client, err := NewClient(ClientOption{InitAddress: []string{"127.0.0.1:6379"}}) if err != nil { panic(err) } defer client.Close() ctx := context.Background() script := NewLuaScript("return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}") script.Exec(ctx, client, []string{"k1", "k2"}, []string{"a1", "a2"}).ToArray()
Output:
func NewLuaScript ¶
NewLuaScript creates a Lua instance whose Lua.Exec uses EVALSHA and EVAL.
func NewLuaScriptReadOnly ¶
NewLuaScriptReadOnly creates a Lua instance whose Lua.Exec uses EVALSHA_RO and EVAL_RO.
func (*Lua) Exec ¶
Exec the script to the given Client. It will first try with the EVALSHA/EVALSHA_RO and then EVAL/EVAL_RO if first try failed. Cross slot keys are prohibited if the Client is a cluster client.
func (*Lua) ExecMulti ¶
ExecMulti exec the script multiple times by the provided LuaExec to the given Client. It will first try SCRIPT LOAD the script to all valkey nodes and then exec it with the EVALSHA/EVALSHA_RO. Cross slot keys within single LuaExec are prohibited if the Client is a cluster client.
type MultiValkeyResultStream ¶
type MultiValkeyResultStream = ValkeyResultStream
type NewCacheStoreFn ¶
type NewCacheStoreFn func(CacheStoreOption) CacheStore
NewCacheStoreFn can be provided in ClientOption for using a custom CacheStore implementation
type PubSubHooks ¶
type PubSubHooks struct { // OnMessage will be called when receiving "message" and "pmessage" event. OnMessage func(m PubSubMessage) // OnSubscription will be called when receiving "subscribe", "unsubscribe", "psubscribe" and "punsubscribe" event. OnSubscription func(s PubSubSubscription) }
PubSubHooks can be registered into DedicatedClient to process pubsub messages without using Client.Receive
type PubSubMessage ¶
type PubSubMessage struct { // Pattern is only available with pmessage. Pattern string // Channel is the channel the message belongs to Channel string // Message is the message content Message string }
PubSubMessage represent a pubsub message from valkey
type PubSubSubscription ¶
type PubSubSubscription struct { // Kind is "subscribe", "unsubscribe", "psubscribe" or "punsubscribe" Kind string // Channel is the event subject. Channel string // Count is the current number of subscriptions for connection. Count int64 }
PubSubSubscription represent a pubsub "subscribe", "unsubscribe", "psubscribe" or "punsubscribe" event.
type RedirectMode ¶
type RedirectMode int
const ( RedirectNone RedirectMode = iota RedirectMove RedirectAsk RedirectRetry )
type ReplicaInfo ¶ added in v1.0.52
ReplicaInfo is the information of a replica node in a valkey cluster.
type RetryDelayFn ¶ added in v1.0.48
RetryDelayFn returns the delay that should be used before retrying the attempt. Will return negative delay if the delay could not be determined or do not retry.
type ScanEntry ¶
ScanEntry is the element type of both SCAN, SSCAN, HSCAN and ZSCAN command response.
type SentinelOption ¶
type SentinelOption struct { // TCP & TLS, same as ClientOption but for connecting sentinel Dialer net.Dialer TLSConfig *tls.Config // MasterSet is the valkey master set name monitored by sentinel cluster. // If this field is set, then ClientOption.InitAddress will be used to connect to sentinel cluster. MasterSet string // Valkey AUTH parameters for sentinel Username string Password string ClientName string }
SentinelOption contains MasterSet,
type SimpleCache ¶
type SimpleCache interface { Get(key string) ValkeyMessage Set(key string, val ValkeyMessage) Del(key string) Flush() }
SimpleCache is an alternative interface should be paired with NewSimpleCacheAdapter to construct a CacheStore
type ValkeyError ¶
type ValkeyError ValkeyMessage
ValkeyError is an error response or a nil message from valkey instance
func IsValkeyErr ¶
func IsValkeyErr(err error) (ret *ValkeyError, ok bool)
IsValkeyErr is a handy method to check if error is a valkey ERR response.
func (*ValkeyError) Error ¶
func (r *ValkeyError) Error() string
func (*ValkeyError) IsAsk ¶
func (r *ValkeyError) IsAsk() (addr string, ok bool)
IsAsk checks if it is a valkey ASK message and returns ask address.
func (*ValkeyError) IsBusyGroup ¶
func (r *ValkeyError) IsBusyGroup() bool
IsBusyGroup checks if it is a valkey BUSYGROUP message.
func (*ValkeyError) IsClusterDown ¶
func (r *ValkeyError) IsClusterDown() bool
IsClusterDown checks if it is a valkey CLUSTERDOWN message and returns ask address.
func (*ValkeyError) IsLoading ¶ added in v1.0.49
func (r *ValkeyError) IsLoading() bool
IsLoading checks if it is a valkey LOADING message
func (*ValkeyError) IsMoved ¶
func (r *ValkeyError) IsMoved() (addr string, ok bool)
IsMoved checks if it is a valkey MOVED message and returns moved address.
func (*ValkeyError) IsNil ¶
func (r *ValkeyError) IsNil() bool
IsNil checks if it is a valkey nil message.
func (*ValkeyError) IsNoScript ¶
func (r *ValkeyError) IsNoScript() bool
IsNoScript checks if it is a valkey NOSCRIPT message.
func (*ValkeyError) IsTryAgain ¶
func (r *ValkeyError) IsTryAgain() bool
IsTryAgain checks if it is a valkey TRYAGAIN message and returns ask address.
type ValkeyMessage ¶
type ValkeyMessage struct {
// contains filtered or unexported fields
}
ValkeyMessage is a valkey response message, it may be a nil response
func (*ValkeyMessage) AsBool ¶
func (m *ValkeyMessage) AsBool() (val bool, err error)
AsBool checks if message is non-nil valkey response, and parses it as bool
func (*ValkeyMessage) AsBoolSlice ¶
func (m *ValkeyMessage) AsBoolSlice() ([]bool, error)
AsBoolSlice checks if message is a valkey array/set response, and converts it to []bool. Valkey nil elements and other non-boolean elements will be represented as false.
func (*ValkeyMessage) AsBytes ¶
func (m *ValkeyMessage) AsBytes() (bs []byte, err error)
AsBytes check if message is a valkey string response and return it as an immutable []byte
func (*ValkeyMessage) AsFloat64 ¶
func (m *ValkeyMessage) AsFloat64() (val float64, err error)
AsFloat64 check if message is a valkey string response, and parse it as float64
func (*ValkeyMessage) AsFloatSlice ¶
func (m *ValkeyMessage) AsFloatSlice() ([]float64, error)
AsFloatSlice check if message is a valkey array/set response, and convert to []float64. valkey nil element and other non float element will be present as zero.
func (*ValkeyMessage) AsFtAggregate ¶
func (m *ValkeyMessage) AsFtAggregate() (total int64, docs []map[string]string, err error)
func (*ValkeyMessage) AsFtAggregateCursor ¶
func (m *ValkeyMessage) AsFtAggregateCursor() (cursor, total int64, docs []map[string]string, err error)
func (*ValkeyMessage) AsFtSearch ¶
func (m *ValkeyMessage) AsFtSearch() (total int64, docs []FtSearchDoc, err error)
func (*ValkeyMessage) AsGeosearch ¶
func (m *ValkeyMessage) AsGeosearch() ([]GeoLocation, error)
func (*ValkeyMessage) AsInt64 ¶
func (m *ValkeyMessage) AsInt64() (val int64, err error)
AsInt64 check if message is a valkey string response, and parse it as int64
func (*ValkeyMessage) AsIntMap ¶
func (m *ValkeyMessage) AsIntMap() (map[string]int64, error)
AsIntMap check if message is a valkey map/array/set response, and convert to map[string]int64. valkey nil element and other non integer element will be present as zero.
func (*ValkeyMessage) AsIntSlice ¶
func (m *ValkeyMessage) AsIntSlice() ([]int64, error)
AsIntSlice check if message is a valkey array/set response, and convert to []int64. valkey nil element and other non integer element will be present as zero.
func (*ValkeyMessage) AsLMPop ¶
func (m *ValkeyMessage) AsLMPop() (kvs KeyValues, err error)
func (*ValkeyMessage) AsMap ¶
func (m *ValkeyMessage) AsMap() (map[string]ValkeyMessage, error)
AsMap check if message is a valkey array/set response, and convert to map[string]ValkeyMessage
func (*ValkeyMessage) AsReader ¶
func (m *ValkeyMessage) AsReader() (reader io.Reader, err error)
AsReader check if message is a valkey string response and wrap it with the strings.NewReader
func (*ValkeyMessage) AsScanEntry ¶
func (m *ValkeyMessage) AsScanEntry() (e ScanEntry, err error)
AsScanEntry check if message is a valkey array/set response of length 2, and convert to ScanEntry.
func (*ValkeyMessage) AsStrMap ¶
func (m *ValkeyMessage) AsStrMap() (map[string]string, error)
AsStrMap check if message is a valkey map/array/set response, and convert to map[string]string. valkey nil element and other non string element will be present as zero.
func (*ValkeyMessage) AsStrSlice ¶
func (m *ValkeyMessage) AsStrSlice() ([]string, error)
AsStrSlice check if message is a valkey array/set response, and convert to []string. valkey nil element and other non string element will be present as zero.
func (*ValkeyMessage) AsUint64 ¶
func (m *ValkeyMessage) AsUint64() (val uint64, err error)
AsUint64 check if message is a valkey string response, and parse it as uint64
func (*ValkeyMessage) AsXRange ¶
func (m *ValkeyMessage) AsXRange() ([]XRangeEntry, error)
AsXRange check if message is a valkey array/set response, and convert to []XRangeEntry
func (*ValkeyMessage) AsXRangeEntry ¶
func (m *ValkeyMessage) AsXRangeEntry() (XRangeEntry, error)
AsXRangeEntry check if message is a valkey array/set response of length 2, and convert to XRangeEntry
func (*ValkeyMessage) AsXRead ¶
func (m *ValkeyMessage) AsXRead() (ret map[string][]XRangeEntry, err error)
AsXRead converts XREAD/XREADGRUOP response to map[string][]XRangeEntry
func (*ValkeyMessage) AsZMPop ¶
func (m *ValkeyMessage) AsZMPop() (kvs KeyZScores, err error)
func (*ValkeyMessage) AsZScore ¶
func (m *ValkeyMessage) AsZScore() (s ZScore, err error)
AsZScore converts ZPOPMAX and ZPOPMIN command with count 1 response to a single ZScore
func (*ValkeyMessage) AsZScores ¶
func (m *ValkeyMessage) AsZScores() ([]ZScore, error)
AsZScores converts ZRANGE WITHSCROES, ZDIFF WITHSCROES and ZPOPMAX/ZPOPMIN command with count > 1 responses to []ZScore
func (*ValkeyMessage) CacheMarshal ¶ added in v1.0.52
func (m *ValkeyMessage) CacheMarshal(buf []byte) []byte
CacheMarshal writes serialized ValkeyMessage to the provided buffer. If the provided buffer is nil, CacheMarshal will allocate one. Note that output format is not compatible with different client versions.
func (*ValkeyMessage) CachePTTL ¶
func (m *ValkeyMessage) CachePTTL() int64
CachePTTL returns the remaining PTTL in seconds of client side cache
func (*ValkeyMessage) CachePXAT ¶
func (m *ValkeyMessage) CachePXAT() int64
CachePXAT returns the remaining PXAT in seconds of client side cache
func (*ValkeyMessage) CacheSize ¶ added in v1.0.52
func (m *ValkeyMessage) CacheSize() int
CacheSize returns the buffer size needed by the CacheMarshal.
func (*ValkeyMessage) CacheTTL ¶
func (m *ValkeyMessage) CacheTTL() (ttl int64)
CacheTTL returns the remaining TTL in seconds of client side cache
func (*ValkeyMessage) CacheUnmarshalView ¶ added in v1.0.52
func (m *ValkeyMessage) CacheUnmarshalView(buf []byte) error
CacheUnmarshalView construct the ValkeyMessage from the buffer produced by CacheMarshal. Note that the buffer can't be reused after CacheUnmarshalView since it uses unsafe.String on top of the buffer.
func (*ValkeyMessage) DecodeJSON ¶
func (m *ValkeyMessage) DecodeJSON(v any) (err error)
DecodeJSON check if message is a valkey string response and treat it as json, then unmarshal it into provided value
func (*ValkeyMessage) Error ¶
func (m *ValkeyMessage) Error() error
Error check if message is a valkey error response, including nil response
func (*ValkeyMessage) IsArray ¶
func (m *ValkeyMessage) IsArray() bool
IsArray check if message is a valkey array response
func (*ValkeyMessage) IsBool ¶
func (m *ValkeyMessage) IsBool() bool
IsBool check if message is a valkey RESP3 bool response
func (*ValkeyMessage) IsCacheHit ¶
func (m *ValkeyMessage) IsCacheHit() bool
IsCacheHit check if message is from client side cache
func (*ValkeyMessage) IsFloat64 ¶
func (m *ValkeyMessage) IsFloat64() bool
IsFloat64 check if message is a valkey RESP3 double response
func (*ValkeyMessage) IsInt64 ¶
func (m *ValkeyMessage) IsInt64() bool
IsInt64 check if message is a valkey RESP3 int response
func (*ValkeyMessage) IsMap ¶
func (m *ValkeyMessage) IsMap() bool
IsMap check if message is a valkey RESP3 map response
func (*ValkeyMessage) IsNil ¶
func (m *ValkeyMessage) IsNil() bool
IsNil check if message is a valkey nil response
func (*ValkeyMessage) IsString ¶
func (m *ValkeyMessage) IsString() bool
IsString check if message is a valkey string response
func (*ValkeyMessage) String ¶
func (m *ValkeyMessage) String() string
String returns human-readable representation of ValkeyMessage
func (*ValkeyMessage) ToAny ¶
func (m *ValkeyMessage) ToAny() (any, error)
ToAny turns message into go any value
func (*ValkeyMessage) ToArray ¶
func (m *ValkeyMessage) ToArray() ([]ValkeyMessage, error)
ToArray check if message is a valkey array/set response, and return it
func (*ValkeyMessage) ToBool ¶
func (m *ValkeyMessage) ToBool() (val bool, err error)
ToBool check if message is a valkey RESP3 bool response, and return it
func (*ValkeyMessage) ToFloat64 ¶
func (m *ValkeyMessage) ToFloat64() (val float64, err error)
ToFloat64 check if message is a valkey RESP3 double response, and return it
func (*ValkeyMessage) ToInt64 ¶
func (m *ValkeyMessage) ToInt64() (val int64, err error)
ToInt64 check if message is a valkey RESP3 int response, and return it
func (*ValkeyMessage) ToMap ¶
func (m *ValkeyMessage) ToMap() (map[string]ValkeyMessage, error)
ToMap check if message is a valkey RESP3 map response, and return it
func (*ValkeyMessage) ToString ¶
func (m *ValkeyMessage) ToString() (val string, err error)
ToString check if message is a valkey string response, and return it
type ValkeyResult ¶
type ValkeyResult struct {
// contains filtered or unexported fields
}
ValkeyResult is the return struct from Client.Do or Client.DoCache it contains either a valkey response or an underlying error (ex. network timeout).
func (ValkeyResult) AsBool ¶
func (r ValkeyResult) AsBool() (v bool, err error)
AsBool delegates to ValkeyMessage.AsBool
func (ValkeyResult) AsBoolSlice ¶
func (r ValkeyResult) AsBoolSlice() (v []bool, err error)
AsBoolSlice delegates to ValkeyMessage.AsBoolSlice
func (ValkeyResult) AsBytes ¶
func (r ValkeyResult) AsBytes() (v []byte, err error)
AsBytes delegates to ValkeyMessage.AsBytes
func (ValkeyResult) AsFloat64 ¶
func (r ValkeyResult) AsFloat64() (v float64, err error)
AsFloat64 delegates to ValkeyMessage.AsFloat64
func (ValkeyResult) AsFloatSlice ¶
func (r ValkeyResult) AsFloatSlice() (v []float64, err error)
AsFloatSlice delegates to ValkeyMessage.AsFloatSlice
func (ValkeyResult) AsFtAggregate ¶
func (r ValkeyResult) AsFtAggregate() (total int64, docs []map[string]string, err error)
func (ValkeyResult) AsFtAggregateCursor ¶
func (r ValkeyResult) AsFtAggregateCursor() (cursor, total int64, docs []map[string]string, err error)
func (ValkeyResult) AsFtSearch ¶
func (r ValkeyResult) AsFtSearch() (total int64, docs []FtSearchDoc, err error)
func (ValkeyResult) AsGeosearch ¶
func (r ValkeyResult) AsGeosearch() (locations []GeoLocation, err error)
func (ValkeyResult) AsInt64 ¶
func (r ValkeyResult) AsInt64() (v int64, err error)
AsInt64 delegates to ValkeyMessage.AsInt64
func (ValkeyResult) AsIntMap ¶
func (r ValkeyResult) AsIntMap() (v map[string]int64, err error)
AsIntMap delegates to ValkeyMessage.AsIntMap
func (ValkeyResult) AsIntSlice ¶
func (r ValkeyResult) AsIntSlice() (v []int64, err error)
AsIntSlice delegates to ValkeyMessage.AsIntSlice
func (ValkeyResult) AsLMPop ¶
func (r ValkeyResult) AsLMPop() (v KeyValues, err error)
func (ValkeyResult) AsMap ¶
func (r ValkeyResult) AsMap() (v map[string]ValkeyMessage, err error)
AsMap delegates to ValkeyMessage.AsMap
func (ValkeyResult) AsReader ¶
func (r ValkeyResult) AsReader() (v io.Reader, err error)
AsReader delegates to ValkeyMessage.AsReader
func (ValkeyResult) AsScanEntry ¶
func (r ValkeyResult) AsScanEntry() (v ScanEntry, err error)
AsScanEntry delegates to ValkeyMessage.AsScanEntry.
func (ValkeyResult) AsStrMap ¶
func (r ValkeyResult) AsStrMap() (v map[string]string, err error)
AsStrMap delegates to ValkeyMessage.AsStrMap
func (ValkeyResult) AsStrSlice ¶
func (r ValkeyResult) AsStrSlice() (v []string, err error)
AsStrSlice delegates to ValkeyMessage.AsStrSlice
func (ValkeyResult) AsUint64 ¶
func (r ValkeyResult) AsUint64() (v uint64, err error)
AsUint64 delegates to ValkeyMessage.AsUint64
func (ValkeyResult) AsXRange ¶
func (r ValkeyResult) AsXRange() (v []XRangeEntry, err error)
AsXRange delegates to ValkeyMessage.AsXRange
func (ValkeyResult) AsXRangeEntry ¶
func (r ValkeyResult) AsXRangeEntry() (v XRangeEntry, err error)
AsXRangeEntry delegates to ValkeyMessage.AsXRangeEntry
func (ValkeyResult) AsXRead ¶
func (r ValkeyResult) AsXRead() (v map[string][]XRangeEntry, err error)
AsXRead delegates to ValkeyMessage.AsXRead
func (ValkeyResult) AsZMPop ¶
func (r ValkeyResult) AsZMPop() (v KeyZScores, err error)
func (ValkeyResult) AsZScore ¶
func (r ValkeyResult) AsZScore() (v ZScore, err error)
AsZScore delegates to ValkeyMessage.AsZScore
func (ValkeyResult) AsZScores ¶
func (r ValkeyResult) AsZScores() (v []ZScore, err error)
AsZScores delegates to ValkeyMessage.AsZScores
func (ValkeyResult) CachePTTL ¶
func (r ValkeyResult) CachePTTL() int64
CachePTTL delegates to ValkeyMessage.CachePTTL
func (ValkeyResult) CachePXAT ¶
func (r ValkeyResult) CachePXAT() int64
CachePXAT delegates to ValkeyMessage.CachePXAT
func (ValkeyResult) CacheTTL ¶
func (r ValkeyResult) CacheTTL() int64
CacheTTL delegates to ValkeyMessage.CacheTTL
func (ValkeyResult) DecodeJSON ¶
func (r ValkeyResult) DecodeJSON(v any) (err error)
DecodeJSON delegates to ValkeyMessage.DecodeJSON
func (ValkeyResult) Error ¶
func (r ValkeyResult) Error() (err error)
Error returns either underlying error or valkey error or nil
func (ValkeyResult) IsCacheHit ¶
func (r ValkeyResult) IsCacheHit() bool
IsCacheHit delegates to ValkeyMessage.IsCacheHit
func (ValkeyResult) NonValkeyError ¶
func (r ValkeyResult) NonValkeyError() error
NonValkeyError can be used to check if there is an underlying error (ex. network timeout).
func (*ValkeyResult) String ¶
func (r *ValkeyResult) String() string
String returns human-readable representation of ValkeyResult
func (ValkeyResult) ToAny ¶
func (r ValkeyResult) ToAny() (v any, err error)
ToAny delegates to ValkeyMessage.ToAny
func (ValkeyResult) ToArray ¶
func (r ValkeyResult) ToArray() (v []ValkeyMessage, err error)
ToArray delegates to ValkeyMessage.ToArray
func (ValkeyResult) ToBool ¶
func (r ValkeyResult) ToBool() (v bool, err error)
ToBool delegates to ValkeyMessage.ToBool
func (ValkeyResult) ToFloat64 ¶
func (r ValkeyResult) ToFloat64() (v float64, err error)
ToFloat64 delegates to ValkeyMessage.ToFloat64
func (ValkeyResult) ToInt64 ¶
func (r ValkeyResult) ToInt64() (v int64, err error)
ToInt64 delegates to ValkeyMessage.ToInt64
func (ValkeyResult) ToMap ¶
func (r ValkeyResult) ToMap() (v map[string]ValkeyMessage, err error)
ToMap delegates to ValkeyMessage.ToMap
func (ValkeyResult) ToMessage ¶
func (r ValkeyResult) ToMessage() (v ValkeyMessage, err error)
ToMessage retrieves the ValkeyMessage
func (ValkeyResult) ToString ¶
func (r ValkeyResult) ToString() (v string, err error)
ToString delegates to ValkeyMessage.ToString
type ValkeyResultStream ¶
type ValkeyResultStream struct {
// contains filtered or unexported fields
}
func (*ValkeyResultStream) Error ¶
func (s *ValkeyResultStream) Error() error
Error returns the error happened when sending commands to valkey or reading response from valkey. Usually a user is not required to use this function because the error is also reported by the WriteTo.
func (*ValkeyResultStream) HasNext ¶
func (s *ValkeyResultStream) HasNext() bool
HasNext can be used in a for loop condition to check if a further WriteTo call is needed.
func (*ValkeyResultStream) WriteTo ¶
func (s *ValkeyResultStream) WriteTo(w io.Writer) (n int64, err error)
WriteTo reads a valkey response from valkey and then write it to the given writer. This function is not thread safe and should be called sequentially to read multiple responses. An io.EOF error will be reported if all responses are read.
type XRangeEntry ¶
XRangeEntry is the element type of both XRANGE and XREVRANGE command response array
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
hack
|
|
internal
|
|
mock
module
|
|
om
module
|
|
valkeycompat
module
|
|
valkeyhook
module
|
|
valkeyotel
module
|
|
valkeyprob
module
|