mirror of
https://github.com/redis/go-redis.git
synced 2025-06-05 06:42:39 +03:00
Merge branch 'master' into hash-expiration-commands-v7.4-comments
This commit is contained in:
commit
0ea1b15eaa
@ -112,3 +112,7 @@ The core team regularly looks at pull requests. We will provide
|
|||||||
feedback as soon as possible. After receiving our feedback, please respond
|
feedback as soon as possible. After receiving our feedback, please respond
|
||||||
within two weeks. After that time, we may close your PR if it isn't
|
within two weeks. After that time, we may close your PR if it isn't
|
||||||
showing any activity.
|
showing any activity.
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
Maintainers can provide limited support to contributors on discord: https://discord.gg/W4txy5AeKM
|
||||||
|
10
README.md
10
README.md
@ -3,8 +3,14 @@
|
|||||||
[](https://github.com/redis/go-redis/actions)
|
[](https://github.com/redis/go-redis/actions)
|
||||||
[](https://pkg.go.dev/github.com/redis/go-redis/v9?tab=doc)
|
[](https://pkg.go.dev/github.com/redis/go-redis/v9?tab=doc)
|
||||||
[](https://redis.uptrace.dev/)
|
[](https://redis.uptrace.dev/)
|
||||||
|
[](https://goreportcard.com/report/github.com/redis/go-redis/v9)
|
||||||
[](https://codecov.io/github/redis/go-redis)
|
[](https://codecov.io/github/redis/go-redis)
|
||||||
[](https://discord.gg/rWtp5Aj)
|
|
||||||
|
[](https://discord.gg/W4txy5AeKM)
|
||||||
|
[](https://www.twitch.tv/redisinc)
|
||||||
|
[](https://www.youtube.com/redisinc)
|
||||||
|
[](https://twitter.com/redisinc)
|
||||||
|
[](https://stackoverflow.com/questions/tagged/go-redis)
|
||||||
|
|
||||||
> go-redis is the official Redis client library for the Go programming language. It offers a straightforward interface for interacting with Redis servers.
|
> go-redis is the official Redis client library for the Go programming language. It offers a straightforward interface for interacting with Redis servers.
|
||||||
|
|
||||||
@ -44,7 +50,7 @@ in the `go.mod` to `go 1.24` in one of the next releases.
|
|||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
- [Discussions](https://github.com/redis/go-redis/discussions)
|
- [Discussions](https://github.com/redis/go-redis/discussions)
|
||||||
- [Chat](https://discord.gg/rWtp5Aj)
|
- [Chat](https://discord.gg/W4txy5AeKM)
|
||||||
- [Reference](https://pkg.go.dev/github.com/redis/go-redis/v9)
|
- [Reference](https://pkg.go.dev/github.com/redis/go-redis/v9)
|
||||||
- [Examples](https://pkg.go.dev/github.com/redis/go-redis/v9#pkg-examples)
|
- [Examples](https://pkg.go.dev/github.com/redis/go-redis/v9#pkg-examples)
|
||||||
|
|
||||||
|
@ -3831,7 +3831,8 @@ func (cmd *MapStringStringSliceCmd) readReply(rd *proto.Reader) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// MapStringInterfaceCmd represents a command that returns a map of strings to interface{}.
|
|
||||||
|
// MapMapStringInterfaceCmd represents a command that returns a map of strings to interface{}.
|
||||||
type MapMapStringInterfaceCmd struct {
|
type MapMapStringInterfaceCmd struct {
|
||||||
baseCmd
|
baseCmd
|
||||||
val map[string]interface{}
|
val map[string]interface{}
|
||||||
|
@ -81,6 +81,8 @@ func appendArg(dst []interface{}, arg interface{}) []interface{} {
|
|||||||
return dst
|
return dst
|
||||||
case time.Time, time.Duration, encoding.BinaryMarshaler, net.IP:
|
case time.Time, time.Duration, encoding.BinaryMarshaler, net.IP:
|
||||||
return append(dst, arg)
|
return append(dst, arg)
|
||||||
|
case nil:
|
||||||
|
return dst
|
||||||
default:
|
default:
|
||||||
// scan struct field
|
// scan struct field
|
||||||
v := reflect.ValueOf(arg)
|
v := reflect.ValueOf(arg)
|
||||||
@ -330,7 +332,7 @@ func (info LibraryInfo) Validate() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hello Set the resp protocol used.
|
// Hello sets the resp protocol used.
|
||||||
func (c statefulCmdable) Hello(ctx context.Context,
|
func (c statefulCmdable) Hello(ctx context.Context,
|
||||||
ver int, username, password, clientName string,
|
ver int, username, password, clientName string,
|
||||||
) *MapStringInterfaceCmd {
|
) *MapStringInterfaceCmd {
|
||||||
|
@ -7209,6 +7209,17 @@ var _ = Describe("Commands", func() {
|
|||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(vals).To(Equal([]interface{}{int64(12), proto.RedisError("error"), "abc"}))
|
Expect(vals).To(Equal([]interface{}{int64(12), proto.RedisError("error"), "abc"}))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("returns empty values when args are nil", func() {
|
||||||
|
vals, err := client.Eval(
|
||||||
|
ctx,
|
||||||
|
"return {ARGV[1]}",
|
||||||
|
[]string{},
|
||||||
|
nil,
|
||||||
|
).Result()
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(vals).To(BeEmpty())
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Describe("EvalRO", func() {
|
Describe("EvalRO", func() {
|
||||||
@ -7232,6 +7243,17 @@ var _ = Describe("Commands", func() {
|
|||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(vals).To(Equal([]interface{}{int64(12), proto.RedisError("error"), "abc"}))
|
Expect(vals).To(Equal([]interface{}{int64(12), proto.RedisError("error"), "abc"}))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("returns empty values when args are nil", func() {
|
||||||
|
vals, err := client.EvalRO(
|
||||||
|
ctx,
|
||||||
|
"return {ARGV[1]}",
|
||||||
|
[]string{},
|
||||||
|
nil,
|
||||||
|
).Result()
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(vals).To(BeEmpty())
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Describe("Functions", func() {
|
Describe("Functions", func() {
|
||||||
|
@ -227,3 +227,107 @@ func ExampleClient_search_json() {
|
|||||||
// London - 1
|
// London - 1
|
||||||
// Tel Aviv - 2
|
// Tel Aviv - 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleClient_search_hash() {
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
rdb := redis.NewClient(&redis.Options{
|
||||||
|
Addr: "localhost:6379",
|
||||||
|
Password: "", // no password docs
|
||||||
|
DB: 0, // use default DB
|
||||||
|
Protocol: 2,
|
||||||
|
})
|
||||||
|
|
||||||
|
// REMOVE_START
|
||||||
|
rdb.Del(ctx, "huser:1", "huser:2", "huser:3")
|
||||||
|
rdb.FTDropIndex(ctx, "hash-idx:users")
|
||||||
|
// REMOVE_END
|
||||||
|
|
||||||
|
// STEP_START make_hash_index
|
||||||
|
_, err := rdb.FTCreate(
|
||||||
|
ctx,
|
||||||
|
"hash-idx:users",
|
||||||
|
// Options:
|
||||||
|
&redis.FTCreateOptions{
|
||||||
|
OnHash: true,
|
||||||
|
Prefix: []interface{}{"huser:"},
|
||||||
|
},
|
||||||
|
// Index schema fields:
|
||||||
|
&redis.FieldSchema{
|
||||||
|
FieldName: "name",
|
||||||
|
FieldType: redis.SearchFieldTypeText,
|
||||||
|
},
|
||||||
|
&redis.FieldSchema{
|
||||||
|
FieldName: "city",
|
||||||
|
FieldType: redis.SearchFieldTypeTag,
|
||||||
|
},
|
||||||
|
&redis.FieldSchema{
|
||||||
|
FieldName: "age",
|
||||||
|
FieldType: redis.SearchFieldTypeNumeric,
|
||||||
|
},
|
||||||
|
).Result()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// STEP_END
|
||||||
|
|
||||||
|
user1 := map[string]interface{}{
|
||||||
|
"name": "Paul John",
|
||||||
|
"email": "paul.john@example.com",
|
||||||
|
"age": 42,
|
||||||
|
"city": "London",
|
||||||
|
}
|
||||||
|
|
||||||
|
user2 := map[string]interface{}{
|
||||||
|
"name": "Eden Zamir",
|
||||||
|
"email": "eden.zamir@example.com",
|
||||||
|
"age": 29,
|
||||||
|
"city": "Tel Aviv",
|
||||||
|
}
|
||||||
|
|
||||||
|
user3 := map[string]interface{}{
|
||||||
|
"name": "Paul Zamir",
|
||||||
|
"email": "paul.zamir@example.com",
|
||||||
|
"age": 35,
|
||||||
|
"city": "Tel Aviv",
|
||||||
|
}
|
||||||
|
|
||||||
|
// STEP_START add_hash_data
|
||||||
|
_, err = rdb.HSet(ctx, "huser:1", user1).Result()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = rdb.HSet(ctx, "huser:2", user2).Result()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = rdb.HSet(ctx, "huser:3", user3).Result()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// STEP_END
|
||||||
|
|
||||||
|
// STEP_START query1_hash
|
||||||
|
findPaulHashResult, err := rdb.FTSearch(
|
||||||
|
ctx,
|
||||||
|
"hash-idx:users",
|
||||||
|
"Paul @age:[30 40]",
|
||||||
|
).Result()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(findPaulHashResult)
|
||||||
|
// >>> {1 [{huser:3 <nil> <nil> <nil> map[age:35 city:Tel Aviv...
|
||||||
|
// STEP_END
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// {1 [{huser:3 <nil> <nil> <nil> map[age:35 city:Tel Aviv email:paul.zamir@example.com name:Paul Zamir]}]}
|
||||||
|
}
|
||||||
|
@ -520,7 +520,7 @@ func (c cmdable) HGetEX(ctx context.Context, key string, fields ...string) *Stri
|
|||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExpirationType represents an expiration option for the HGETEX command.
|
// HGetEXExpirationType represents an expiration option for the HGETEX command.
|
||||||
type HGetEXExpirationType string
|
type HGetEXExpirationType string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
Loading…
x
Reference in New Issue
Block a user