mirror of
https://github.com/redis/go-redis.git
synced 2025-07-16 13:21:51 +03:00
Merge branch 'master' into bitop
This commit is contained in:
61
command.go
61
command.go
@ -17,6 +17,55 @@ import (
|
||||
"github.com/redis/go-redis/v9/internal/util"
|
||||
)
|
||||
|
||||
// keylessCommands contains Redis commands that have empty key specifications (9th slot empty)
|
||||
// Only includes core Redis commands, excludes FT.*, ts.*, timeseries.*, search.* and subcommands
|
||||
var keylessCommands = map[string]struct{}{
|
||||
"acl": {},
|
||||
"asking": {},
|
||||
"auth": {},
|
||||
"bgrewriteaof": {},
|
||||
"bgsave": {},
|
||||
"client": {},
|
||||
"cluster": {},
|
||||
"config": {},
|
||||
"debug": {},
|
||||
"discard": {},
|
||||
"echo": {},
|
||||
"exec": {},
|
||||
"failover": {},
|
||||
"function": {},
|
||||
"hello": {},
|
||||
"latency": {},
|
||||
"lolwut": {},
|
||||
"module": {},
|
||||
"monitor": {},
|
||||
"multi": {},
|
||||
"pfselftest": {},
|
||||
"ping": {},
|
||||
"psubscribe": {},
|
||||
"psync": {},
|
||||
"publish": {},
|
||||
"pubsub": {},
|
||||
"punsubscribe": {},
|
||||
"quit": {},
|
||||
"readonly": {},
|
||||
"readwrite": {},
|
||||
"replconf": {},
|
||||
"replicaof": {},
|
||||
"role": {},
|
||||
"save": {},
|
||||
"script": {},
|
||||
"select": {},
|
||||
"shutdown": {},
|
||||
"slaveof": {},
|
||||
"slowlog": {},
|
||||
"subscribe": {},
|
||||
"swapdb": {},
|
||||
"sync": {},
|
||||
"unsubscribe": {},
|
||||
"unwatch": {},
|
||||
}
|
||||
|
||||
type Cmder interface {
|
||||
// command name.
|
||||
// e.g. "set k v ex 10" -> "set", "cluster info" -> "cluster".
|
||||
@ -75,12 +124,22 @@ func writeCmd(wr *proto.Writer, cmd Cmder) error {
|
||||
return wr.WriteArgs(cmd.Args())
|
||||
}
|
||||
|
||||
// cmdFirstKeyPos returns the position of the first key in the command's arguments.
|
||||
// If the command does not have a key, it returns 0.
|
||||
// TODO: Use the data in CommandInfo to determine the first key position.
|
||||
func cmdFirstKeyPos(cmd Cmder) int {
|
||||
if pos := cmd.firstKeyPos(); pos != 0 {
|
||||
return int(pos)
|
||||
}
|
||||
|
||||
switch cmd.Name() {
|
||||
name := cmd.Name()
|
||||
|
||||
// first check if the command is keyless
|
||||
if _, ok := keylessCommands[name]; ok {
|
||||
return 0
|
||||
}
|
||||
|
||||
switch name {
|
||||
case "eval", "evalsha", "eval_ro", "evalsha_ro":
|
||||
if cmd.stringArg(2) != "0" {
|
||||
return 3
|
||||
|
Reference in New Issue
Block a user