diff --git a/Makefile b/Makefile index 00cf1de5..d8d00759 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ build: testdata/redis: mkdir -p $@ - wget -qO- https://download.redis.io/releases/redis-7.4-rc1.tar.gz | tar xvz --strip-components=1 -C $@ + wget -qO- https://download.redis.io/releases/redis-7.4-rc2.tar.gz | tar xvz --strip-components=1 -C $@ testdata/redis/src/redis-server: testdata/redis cd $< && make all diff --git a/commands_test.go b/commands_test.go index edc95694..9554bf9a 100644 --- a/commands_test.go +++ b/commands_test.go @@ -2486,35 +2486,40 @@ var _ = Describe("Commands", func() { }) It("should HExpire", Label("hash-expiration", "NonRedisEnterprise"), func() { - res, err := client.HExpire(ctx, "no_such_key", 10, "field1", "field2", "field3").Result() + res, err := client.HExpire(ctx, "no_such_key", 10*time.Second, "field1", "field2", "field3").Result() Expect(err).To(BeNil()) + Expect(res).To(BeEquivalentTo([]int64{-2, -2, -2})) + for i := 0; i < 100; i++ { sadd := client.HSet(ctx, "myhash", fmt.Sprintf("key%d", i), "hello") Expect(sadd.Err()).NotTo(HaveOccurred()) } - res, err = client.HExpire(ctx, "myhash", 10, "key1", "key2", "key200").Result() + res, err = client.HExpire(ctx, "myhash", 10*time.Second, "key1", "key2", "key200").Result() Expect(err).NotTo(HaveOccurred()) Expect(res).To(Equal([]int64{1, 1, -2})) }) It("should HPExpire", Label("hash-expiration", "NonRedisEnterprise"), func() { - _, err := client.HPExpire(ctx, "no_such_key", 10, "field1", "field2", "field3").Result() + res, err := client.HPExpire(ctx, "no_such_key", 10*time.Second, "field1", "field2", "field3").Result() Expect(err).To(BeNil()) + Expect(res).To(BeEquivalentTo([]int64{-2, -2, -2})) + for i := 0; i < 100; i++ { sadd := client.HSet(ctx, "myhash", fmt.Sprintf("key%d", i), "hello") Expect(sadd.Err()).NotTo(HaveOccurred()) } - res, err := client.HPExpire(ctx, "myhash", 10, "key1", "key2", "key200").Result() + res, err = client.HPExpire(ctx, "myhash", 10*time.Second, "key1", "key2", "key200").Result() Expect(err).NotTo(HaveOccurred()) Expect(res).To(Equal([]int64{1, 1, -2})) }) It("should HExpireAt", Label("hash-expiration", "NonRedisEnterprise"), func() { - - _, err := client.HExpireAt(ctx, "no_such_key", time.Now().Add(10*time.Second), "field1", "field2", "field3").Result() + resEmpty, err := client.HExpireAt(ctx, "no_such_key", time.Now().Add(10*time.Second), "field1", "field2", "field3").Result() Expect(err).To(BeNil()) + Expect(resEmpty).To(BeEquivalentTo([]int64{-2, -2, -2})) + for i := 0; i < 100; i++ { sadd := client.HSet(ctx, "myhash", fmt.Sprintf("key%d", i), "hello") Expect(sadd.Err()).NotTo(HaveOccurred()) @@ -2526,9 +2531,10 @@ var _ = Describe("Commands", func() { }) It("should HPExpireAt", Label("hash-expiration", "NonRedisEnterprise"), func() { - - _, err := client.HPExpireAt(ctx, "no_such_key", time.Now().Add(10*time.Second), "field1", "field2", "field3").Result() + resEmpty, err := client.HPExpireAt(ctx, "no_such_key", time.Now().Add(10*time.Second), "field1", "field2", "field3").Result() Expect(err).To(BeNil()) + Expect(resEmpty).To(BeEquivalentTo([]int64{-2, -2, -2})) + for i := 0; i < 100; i++ { sadd := client.HSet(ctx, "myhash", fmt.Sprintf("key%d", i), "hello") Expect(sadd.Err()).NotTo(HaveOccurred()) @@ -2540,9 +2546,10 @@ var _ = Describe("Commands", func() { }) It("should HPersist", Label("hash-expiration", "NonRedisEnterprise"), func() { - - _, err := client.HPersist(ctx, "no_such_key", "field1", "field2", "field3").Result() + resEmpty, err := client.HPersist(ctx, "no_such_key", "field1", "field2", "field3").Result() Expect(err).To(BeNil()) + Expect(resEmpty).To(BeEquivalentTo([]int64{-2, -2, -2})) + for i := 0; i < 100; i++ { sadd := client.HSet(ctx, "myhash", fmt.Sprintf("key%d", i), "hello") Expect(sadd.Err()).NotTo(HaveOccurred()) @@ -2552,7 +2559,7 @@ var _ = Describe("Commands", func() { Expect(err).NotTo(HaveOccurred()) Expect(res).To(Equal([]int64{-1, -1, -2})) - res, err = client.HExpire(ctx, "myhash", 10, "key1", "key200").Result() + res, err = client.HExpire(ctx, "myhash", 10*time.Second, "key1", "key200").Result() Expect(err).NotTo(HaveOccurred()) Expect(res).To(Equal([]int64{1, -2})) @@ -2562,15 +2569,16 @@ var _ = Describe("Commands", func() { }) It("should HExpireTime", Label("hash-expiration", "NonRedisEnterprise"), func() { - - _, err := client.HExpireTime(ctx, "no_such_key", "field1", "field2", "field3").Result() + resEmpty, err := client.HExpireTime(ctx, "no_such_key", "field1", "field2", "field3").Result() Expect(err).To(BeNil()) + Expect(resEmpty).To(BeEquivalentTo([]int64{-2, -2, -2})) + for i := 0; i < 100; i++ { sadd := client.HSet(ctx, "myhash", fmt.Sprintf("key%d", i), "hello") Expect(sadd.Err()).NotTo(HaveOccurred()) } - res, err := client.HExpire(ctx, "myhash", 10, "key1", "key200").Result() + res, err := client.HExpire(ctx, "myhash", 10*time.Second, "key1", "key200").Result() Expect(err).NotTo(HaveOccurred()) Expect(res).To(Equal([]int64{1, -2})) @@ -2580,9 +2588,10 @@ var _ = Describe("Commands", func() { }) It("should HPExpireTime", Label("hash-expiration", "NonRedisEnterprise"), func() { - - _, err := client.HPExpireTime(ctx, "no_such_key", "field1", "field2", "field3").Result() + resEmpty, err := client.HPExpireTime(ctx, "no_such_key", "field1", "field2", "field3").Result() Expect(err).To(BeNil()) + Expect(resEmpty).To(BeEquivalentTo([]int64{-2, -2, -2})) + for i := 0; i < 100; i++ { sadd := client.HSet(ctx, "myhash", fmt.Sprintf("key%d", i), "hello") Expect(sadd.Err()).NotTo(HaveOccurred()) @@ -2599,15 +2608,16 @@ var _ = Describe("Commands", func() { }) It("should HTTL", Label("hash-expiration", "NonRedisEnterprise"), func() { - - _, err := client.HTTL(ctx, "no_such_key", "field1", "field2", "field3").Result() + resEmpty, err := client.HTTL(ctx, "no_such_key", "field1", "field2", "field3").Result() Expect(err).To(BeNil()) + Expect(resEmpty).To(BeEquivalentTo([]int64{-2, -2, -2})) + for i := 0; i < 100; i++ { sadd := client.HSet(ctx, "myhash", fmt.Sprintf("key%d", i), "hello") Expect(sadd.Err()).NotTo(HaveOccurred()) } - res, err := client.HExpire(ctx, "myhash", 10, "key1", "key200").Result() + res, err := client.HExpire(ctx, "myhash", 10*time.Second, "key1", "key200").Result() Expect(err).NotTo(HaveOccurred()) Expect(res).To(Equal([]int64{1, -2})) @@ -2617,15 +2627,16 @@ var _ = Describe("Commands", func() { }) It("should HPTTL", Label("hash-expiration", "NonRedisEnterprise"), func() { - - _, err := client.HPTTL(ctx, "no_such_key", "field1", "field2", "field3").Result() + resEmpty, err := client.HPTTL(ctx, "no_such_key", "field1", "field2", "field3").Result() Expect(err).To(BeNil()) + Expect(resEmpty).To(BeEquivalentTo([]int64{-2, -2, -2})) + for i := 0; i < 100; i++ { sadd := client.HSet(ctx, "myhash", fmt.Sprintf("key%d", i), "hello") Expect(sadd.Err()).NotTo(HaveOccurred()) } - res, err := client.HExpire(ctx, "myhash", 10, "key1", "key200").Result() + res, err := client.HExpire(ctx, "myhash", 10*time.Second, "key1", "key200").Result() Expect(err).NotTo(HaveOccurred()) Expect(res).To(Equal([]int64{1, -2})) diff --git a/hash_commands.go b/hash_commands.go index ef69064e..dcffdcdd 100644 --- a/hash_commands.go +++ b/hash_commands.go @@ -23,6 +23,19 @@ type HashCmdable interface { HVals(ctx context.Context, key string) *StringSliceCmd HRandField(ctx context.Context, key string, count int) *StringSliceCmd HRandFieldWithValues(ctx context.Context, key string, count int) *KeyValueSliceCmd + HExpire(ctx context.Context, key string, expiration time.Duration, fields ...string) *IntSliceCmd + HExpireWithArgs(ctx context.Context, key string, expiration time.Duration, expirationArgs HExpireArgs, fields ...string) *IntSliceCmd + HPExpire(ctx context.Context, key string, expiration time.Duration, fields ...string) *IntSliceCmd + HPExpireWithArgs(ctx context.Context, key string, expiration time.Duration, expirationArgs HExpireArgs, fields ...string) *IntSliceCmd + HExpireAt(ctx context.Context, key string, tm time.Time, fields ...string) *IntSliceCmd + HExpireAtWithArgs(ctx context.Context, key string, tm time.Time, expirationArgs HExpireArgs, fields ...string) *IntSliceCmd + HPExpireAt(ctx context.Context, key string, tm time.Time, fields ...string) *IntSliceCmd + HPExpireAtWithArgs(ctx context.Context, key string, tm time.Time, expirationArgs HExpireArgs, fields ...string) *IntSliceCmd + HPersist(ctx context.Context, key string, fields ...string) *IntSliceCmd + HExpireTime(ctx context.Context, key string, fields ...string) *IntSliceCmd + HPExpireTime(ctx context.Context, key string, fields ...string) *IntSliceCmd + HTTL(ctx context.Context, key string, fields ...string) *IntSliceCmd + HPTTL(ctx context.Context, key string, fields ...string) *IntSliceCmd } func (c cmdable) HDel(ctx context.Context, key string, fields ...string) *IntCmd { @@ -202,7 +215,7 @@ type HExpireArgs struct { // The command constructs an argument list starting with "HEXPIRE", followed by the key, duration, any conditional flags, and the specified fields. // For more information - https://redis.io/commands/hexpire/ func (c cmdable) HExpire(ctx context.Context, key string, expiration time.Duration, fields ...string) *IntSliceCmd { - args := []interface{}{"HEXPIRE", key, expiration, "FIELDS", len(fields)} + args := []interface{}{"HEXPIRE", key, formatSec(ctx, expiration), "FIELDS", len(fields)} for _, field := range fields { args = append(args, field) @@ -217,7 +230,7 @@ func (c cmdable) HExpire(ctx context.Context, key string, expiration time.Durati // The command constructs an argument list starting with "HEXPIRE", followed by the key, duration, any conditional flags, and the specified fields. // For more information - https://redis.io/commands/hexpire/ func (c cmdable) HExpireWithArgs(ctx context.Context, key string, expiration time.Duration, expirationArgs HExpireArgs, fields ...string) *IntSliceCmd { - args := []interface{}{"HEXPIRE", key, expiration} + args := []interface{}{"HEXPIRE", key, formatSec(ctx, expiration)} // only if one argument is true, we can add it to the args // if more than one argument is true, it will cause an error