mirror of https://github.com/go-redis/redis.git
feat: cache init
Signed-off-by: monkey92t <golang@88.com>
This commit is contained in:
parent
842b65fb60
commit
0761b27368
|
@ -0,0 +1,107 @@
|
||||||
|
package redis
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/redis/go-redis/v9/internal/pool"
|
||||||
|
"github.com/redis/go-redis/v9/internal/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Cache interface{}
|
||||||
|
|
||||||
|
type cache struct {
|
||||||
|
// cluster? sentinel?
|
||||||
|
conn *Conn
|
||||||
|
}
|
||||||
|
|
||||||
|
func newCache() Cache {
|
||||||
|
// ?
|
||||||
|
return &cache{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// extension method
|
||||||
|
|
||||||
|
func (c *Conn) readReply(ctx context.Context, timeout time.Duration, fn func(rd *proto.Reader) error) error {
|
||||||
|
return c.withConn(ctx, func(ctx context.Context, conn *pool.Conn) error {
|
||||||
|
return conn.WithReader(ctx, timeout, fn)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Client-side caching command.
|
||||||
|
|
||||||
|
type trackingArgs struct {
|
||||||
|
redirect int
|
||||||
|
prefixes []string
|
||||||
|
broadcast bool
|
||||||
|
optIn bool
|
||||||
|
optOut bool
|
||||||
|
noLoop bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cache) clientTracking(ctx context.Context, t *trackingArgs) *StringCmd {
|
||||||
|
args := make([]any, 0, 7+len(t.prefixes))
|
||||||
|
args = append(args, "CLIENT", "TRACKING", "ON")
|
||||||
|
if t.redirect > 0 {
|
||||||
|
args = append(args, "REDIRECT", t.redirect)
|
||||||
|
}
|
||||||
|
if len(t.prefixes) > 0 {
|
||||||
|
for _, prefix := range t.prefixes {
|
||||||
|
args = append(args, "PREFIX", prefix)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if t.optIn {
|
||||||
|
args = append(args, "OPTIN")
|
||||||
|
}
|
||||||
|
if t.optOut {
|
||||||
|
args = append(args, "OPTOUT")
|
||||||
|
}
|
||||||
|
if t.noLoop {
|
||||||
|
args = append(args, "NOLOOP")
|
||||||
|
}
|
||||||
|
cmd := NewStringCmd(ctx, args...)
|
||||||
|
_ = c.conn.Process(ctx, cmd)
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cache) trackingClose(ctx context.Context) error {
|
||||||
|
return c.conn.Process(ctx, NewStringCmd(ctx, "CLIENT", "TRACKING", "OFF"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cache) cachingYes(ctx context.Context) error {
|
||||||
|
return c.conn.Process(ctx, NewStringCmd(ctx, "CLIENT", "CACHING", "YES"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cache) cachingNo(ctx context.Context) error {
|
||||||
|
return c.conn.Process(ctx, NewStringCmd(ctx, "CLIENT", "CACHING", "NO"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// invalidatePush check if the data packet is a key-invalidate push and return the invalid key.
|
||||||
|
func (c *cache) invalidatePush(v []any) ([]string, bool) {
|
||||||
|
if len(v) != 2 {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
if s, ok := v[0].(string); !ok || s != "invalidate" {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
slice, ok := v[1].([]any)
|
||||||
|
if !ok {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
keys := make([]string, 0, len(slice))
|
||||||
|
for i := 0; i < len(slice); i++ {
|
||||||
|
if s, ok := slice[i].(string); ok {
|
||||||
|
keys = append(keys, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return keys, true
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------- Broadcasting -------------------------------------
|
Loading…
Reference in New Issue