mirror of https://github.com/go-redis/redis.git
290 lines
8.8 KiB
Go
290 lines
8.8 KiB
Go
package redis
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type ListCmdable interface {
|
|
BLPop(ctx context.Context, timeout time.Duration, keys ...string) *StringSliceCmd
|
|
BLMPop(ctx context.Context, timeout time.Duration, direction string, count int64, keys ...string) *KeyValuesCmd
|
|
BRPop(ctx context.Context, timeout time.Duration, keys ...string) *StringSliceCmd
|
|
BRPopLPush(ctx context.Context, source, destination string, timeout time.Duration) *StringCmd
|
|
LIndex(ctx context.Context, key string, index int64) *StringCmd
|
|
LInsert(ctx context.Context, key, op string, pivot, value interface{}) *IntCmd
|
|
LInsertBefore(ctx context.Context, key string, pivot, value interface{}) *IntCmd
|
|
LInsertAfter(ctx context.Context, key string, pivot, value interface{}) *IntCmd
|
|
LLen(ctx context.Context, key string) *IntCmd
|
|
LMPop(ctx context.Context, direction string, count int64, keys ...string) *KeyValuesCmd
|
|
LPop(ctx context.Context, key string) *StringCmd
|
|
LPopCount(ctx context.Context, key string, count int) *StringSliceCmd
|
|
LPos(ctx context.Context, key string, value string, args LPosArgs) *IntCmd
|
|
LPosCount(ctx context.Context, key string, value string, count int64, args LPosArgs) *IntSliceCmd
|
|
LPush(ctx context.Context, key string, values ...interface{}) *IntCmd
|
|
LPushX(ctx context.Context, key string, values ...interface{}) *IntCmd
|
|
LRange(ctx context.Context, key string, start, stop int64) *StringSliceCmd
|
|
LRem(ctx context.Context, key string, count int64, value interface{}) *IntCmd
|
|
LSet(ctx context.Context, key string, index int64, value interface{}) *StatusCmd
|
|
LTrim(ctx context.Context, key string, start, stop int64) *StatusCmd
|
|
RPop(ctx context.Context, key string) *StringCmd
|
|
RPopCount(ctx context.Context, key string, count int) *StringSliceCmd
|
|
RPopLPush(ctx context.Context, source, destination string) *StringCmd
|
|
RPush(ctx context.Context, key string, values ...interface{}) *IntCmd
|
|
RPushX(ctx context.Context, key string, values ...interface{}) *IntCmd
|
|
LMove(ctx context.Context, source, destination, srcpos, destpos string) *StringCmd
|
|
BLMove(ctx context.Context, source, destination, srcpos, destpos string, timeout time.Duration) *StringCmd
|
|
}
|
|
|
|
func (c cmdable) BLPop(ctx context.Context, timeout time.Duration, keys ...string) *StringSliceCmd {
|
|
args := make([]interface{}, 1+len(keys)+1)
|
|
args[0] = "blpop"
|
|
for i, key := range keys {
|
|
args[1+i] = key
|
|
}
|
|
args[len(args)-1] = formatSec(ctx, timeout)
|
|
cmd := NewStringSliceCmd(ctx, args...)
|
|
cmd.setReadTimeout(timeout)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) BLMPop(ctx context.Context, timeout time.Duration, direction string, count int64, keys ...string) *KeyValuesCmd {
|
|
args := make([]interface{}, 3+len(keys), 6+len(keys))
|
|
args[0] = "blmpop"
|
|
args[1] = formatSec(ctx, timeout)
|
|
args[2] = len(keys)
|
|
for i, key := range keys {
|
|
args[3+i] = key
|
|
}
|
|
args = append(args, strings.ToLower(direction), "count", count)
|
|
cmd := NewKeyValuesCmd(ctx, args...)
|
|
cmd.setReadTimeout(timeout)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) BRPop(ctx context.Context, timeout time.Duration, keys ...string) *StringSliceCmd {
|
|
args := make([]interface{}, 1+len(keys)+1)
|
|
args[0] = "brpop"
|
|
for i, key := range keys {
|
|
args[1+i] = key
|
|
}
|
|
args[len(keys)+1] = formatSec(ctx, timeout)
|
|
cmd := NewStringSliceCmd(ctx, args...)
|
|
cmd.setReadTimeout(timeout)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) BRPopLPush(ctx context.Context, source, destination string, timeout time.Duration) *StringCmd {
|
|
cmd := NewStringCmd(
|
|
ctx,
|
|
"brpoplpush",
|
|
source,
|
|
destination,
|
|
formatSec(ctx, timeout),
|
|
)
|
|
cmd.setReadTimeout(timeout)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LIndex(ctx context.Context, key string, index int64) *StringCmd {
|
|
cmd := NewStringCmd(ctx, "lindex", key, index)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
// LMPop Pops one or more elements from the first non-empty list key from the list of provided key names.
|
|
// direction: left or right, count: > 0
|
|
// example: client.LMPop(ctx, "left", 3, "key1", "key2")
|
|
func (c cmdable) LMPop(ctx context.Context, direction string, count int64, keys ...string) *KeyValuesCmd {
|
|
args := make([]interface{}, 2+len(keys), 5+len(keys))
|
|
args[0] = "lmpop"
|
|
args[1] = len(keys)
|
|
for i, key := range keys {
|
|
args[2+i] = key
|
|
}
|
|
args = append(args, strings.ToLower(direction), "count", count)
|
|
cmd := NewKeyValuesCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LInsert(ctx context.Context, key, op string, pivot, value interface{}) *IntCmd {
|
|
cmd := NewIntCmd(ctx, "linsert", key, op, pivot, value)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LInsertBefore(ctx context.Context, key string, pivot, value interface{}) *IntCmd {
|
|
cmd := NewIntCmd(ctx, "linsert", key, "before", pivot, value)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LInsertAfter(ctx context.Context, key string, pivot, value interface{}) *IntCmd {
|
|
cmd := NewIntCmd(ctx, "linsert", key, "after", pivot, value)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LLen(ctx context.Context, key string) *IntCmd {
|
|
cmd := NewIntCmd(ctx, "llen", key)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LPop(ctx context.Context, key string) *StringCmd {
|
|
cmd := NewStringCmd(ctx, "lpop", key)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LPopCount(ctx context.Context, key string, count int) *StringSliceCmd {
|
|
cmd := NewStringSliceCmd(ctx, "lpop", key, count)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
type LPosArgs struct {
|
|
Rank, MaxLen int64
|
|
}
|
|
|
|
func (c cmdable) LPos(ctx context.Context, key string, value string, a LPosArgs) *IntCmd {
|
|
args := []interface{}{"lpos", key, value}
|
|
if a.Rank != 0 {
|
|
args = append(args, "rank", a.Rank)
|
|
}
|
|
if a.MaxLen != 0 {
|
|
args = append(args, "maxlen", a.MaxLen)
|
|
}
|
|
|
|
cmd := NewIntCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LPosCount(ctx context.Context, key string, value string, count int64, a LPosArgs) *IntSliceCmd {
|
|
args := []interface{}{"lpos", key, value, "count", count}
|
|
if a.Rank != 0 {
|
|
args = append(args, "rank", a.Rank)
|
|
}
|
|
if a.MaxLen != 0 {
|
|
args = append(args, "maxlen", a.MaxLen)
|
|
}
|
|
cmd := NewIntSliceCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LPush(ctx context.Context, key string, values ...interface{}) *IntCmd {
|
|
args := make([]interface{}, 2, 2+len(values))
|
|
args[0] = "lpush"
|
|
args[1] = key
|
|
args = appendArgs(args, values)
|
|
cmd := NewIntCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LPushX(ctx context.Context, key string, values ...interface{}) *IntCmd {
|
|
args := make([]interface{}, 2, 2+len(values))
|
|
args[0] = "lpushx"
|
|
args[1] = key
|
|
args = appendArgs(args, values)
|
|
cmd := NewIntCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LRange(ctx context.Context, key string, start, stop int64) *StringSliceCmd {
|
|
cmd := NewStringSliceCmd(
|
|
ctx,
|
|
"lrange",
|
|
key,
|
|
start,
|
|
stop,
|
|
)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LRem(ctx context.Context, key string, count int64, value interface{}) *IntCmd {
|
|
cmd := NewIntCmd(ctx, "lrem", key, count, value)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LSet(ctx context.Context, key string, index int64, value interface{}) *StatusCmd {
|
|
cmd := NewStatusCmd(ctx, "lset", key, index, value)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LTrim(ctx context.Context, key string, start, stop int64) *StatusCmd {
|
|
cmd := NewStatusCmd(
|
|
ctx,
|
|
"ltrim",
|
|
key,
|
|
start,
|
|
stop,
|
|
)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) RPop(ctx context.Context, key string) *StringCmd {
|
|
cmd := NewStringCmd(ctx, "rpop", key)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) RPopCount(ctx context.Context, key string, count int) *StringSliceCmd {
|
|
cmd := NewStringSliceCmd(ctx, "rpop", key, count)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) RPopLPush(ctx context.Context, source, destination string) *StringCmd {
|
|
cmd := NewStringCmd(ctx, "rpoplpush", source, destination)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) RPush(ctx context.Context, key string, values ...interface{}) *IntCmd {
|
|
args := make([]interface{}, 2, 2+len(values))
|
|
args[0] = "rpush"
|
|
args[1] = key
|
|
args = appendArgs(args, values)
|
|
cmd := NewIntCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) RPushX(ctx context.Context, key string, values ...interface{}) *IntCmd {
|
|
args := make([]interface{}, 2, 2+len(values))
|
|
args[0] = "rpushx"
|
|
args[1] = key
|
|
args = appendArgs(args, values)
|
|
cmd := NewIntCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) LMove(ctx context.Context, source, destination, srcpos, destpos string) *StringCmd {
|
|
cmd := NewStringCmd(ctx, "lmove", source, destination, srcpos, destpos)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) BLMove(
|
|
ctx context.Context, source, destination, srcpos, destpos string, timeout time.Duration,
|
|
) *StringCmd {
|
|
cmd := NewStringCmd(ctx, "blmove", source, destination, srcpos, destpos, formatSec(ctx, timeout))
|
|
cmd.setReadTimeout(timeout)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|