1
0
mirror of https://github.com/redis/go-redis.git synced 2025-07-29 17:41:15 +03:00

Add SetArgs command (#1662)

* Add SetWithArgs command

* Add tests for SetWithArgs command

* Replace Makefile stable version by 6.2-rc3 version

* Increase threshold because there are more commands

* Reduce the SetWithArgs command doc comment

* Rename SetWithArgs to SetArgs

* Rename ExpireAt to TTL

* Add KeepTTL field

* Add ExpireAt field as time.Time type

* Improve comments readability

* Add more tests for ExpireAt field

* Fix typo

* Fix multiple if/else chain lint error
This commit is contained in:
You Den
2021-02-17 07:48:47 -05:00
committed by GitHub
parent 9467d5673b
commit 7b7f9d6e0e
3 changed files with 292 additions and 3 deletions

View File

@ -788,6 +788,55 @@ func (c cmdable) Set(ctx context.Context, key string, value interface{}, expirat
return cmd
}
// SetArgs provides arguments for the SetArgs function.
type SetArgs struct {
// Mode can be `NX` or `XX` or empty.
Mode string
// Zero `TTL` or `Expiration` means that the key has no expiration time.
TTL time.Duration
ExpireAt time.Time
// When Get is true, the command returns the old value stored at key, or nil when key did not exist.
Get bool
// KeepTTL is a Redis KEEPTTL option to keep existing TTL.
KeepTTL bool
}
// SetArgs supports all the options that the SET command supports.
// It is the alternative to the Set function when you want
// to have more control over the options.
func (c cmdable) SetArgs(ctx context.Context, key string, value interface{}, a *SetArgs) *StatusCmd {
args := []interface{}{"set", key, value}
if a.KeepTTL {
args = append(args, "keepttl")
}
if !a.ExpireAt.IsZero() && !a.KeepTTL {
args = append(args, "exat", a.ExpireAt.Unix())
} else if a.TTL > 0 && !a.KeepTTL {
if usePrecise(a.TTL) {
args = append(args, "px", formatMs(ctx, a.TTL))
} else {
args = append(args, "ex", formatSec(ctx, a.TTL))
}
}
if a.Mode != "" {
args = append(args, a.Mode)
}
if a.Get {
args = append(args, "get")
}
cmd := NewStatusCmd(ctx, args...)
_ = c(ctx, cmd)
return cmd
}
// Redis `SETEX key expiration value` command.
func (c cmdable) SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) *StatusCmd {
cmd := NewStatusCmd(ctx, "setex", key, formatSec(ctx, expiration), value)