Logo
Section 1 / 5

字符串与哈希

学习字符串和哈希的基本知识,以及如何使用 go-redis 客户端执行它们的操作。

导入

字符串与哈希

学习字符串和哈希的基本知识,以及如何使用 go-redis 客户端执行它们的操作。

设置键的值

1client.Set(ctx, "foo", "bar", 0).Result()

为键指定生存时间

1client.Set(ctx, "foo1", "bar1", 2*time.Second).Result() 2time.Sleep(3 * time.Second) 3 4_, err = client.Get(ctx, "foo1").Result() 5if err != nil { 6 if errors.Is(err, redis.Nil) { 7 log.Println("foo1 已过期") 8 } 9}

原子性递增操作

1client.Incr(ctx, "uid").Err() 2client.IncrBy(ctx, "uid", 3) 3uid, _ := client.Get(ctx, "uid").Result() // uid 为 4

获取并设置操作

1client.SetArgs(ctx, "uid", 0, redis.SetArgs{Get: true})

获取字符串的子范围

1client.Set(ctx, "long_string", "welcome to educative", 0) 2subString, _ := client.GetRange(ctx, "long_string", 0, 6).Result()
1package main 2 3import ( 4 "context" 5 "errors" 6 "flag" 7 "log" 8 "time" 9 10 "github.com/go-redis/redis/v8" 11) 12 13func main() { 14 client := redis.NewClient(&redis.Options{Addr: "localhost:6379"}) 15 _, err := client.Ping(context.Background()).Result() 16 17 if err != nil { 18 log.Fatal("ping 失败。无法连接", err) 19 } 20 21 strings(client) 22} 23 24func strings(client *redis.Client) { 25 26 ctx := context.Background() 27 28 _, err := client.Set(ctx, "foo", "bar", 0).Result() 29 30 if err != nil { 31 log.Fatal("设置失败", err) 32 } 33 log.Println("设置值成功") 34 35 res, _ := client.Get(ctx, "foo").Result() 36 log.Println("foo=", res) 37 38 client.Set(ctx, "foo1", "bar1", 2*time.Second).Result() 39 time.Sleep(3 * time.Second) 40 41 _, err = client.Get(ctx, "foo1").Result() 42 if err != nil { 43 if errors.Is(err, redis.Nil) { 44 log.Println("foo1 已过期") 45 } 46 } 47 48 err = client.Incr(ctx, "uid").Err() 49 if err != nil { 50 log.Fatal("递增失败", err) 51 } 52 53 client.IncrBy(ctx, "uid", 3) 54 uid, _ := client.Get(ctx, "uid").Result() 55 log.Println("uid=", uid) 56 57 // 带获取的设置 - 原子操作 58 client.SetArgs(ctx, "uid", 0, redis.SetArgs{Get: true}) 59 log.Println("uid=", client.Get(ctx, "uid").Val()) 60 61 // 获取子字符串 62 client.Set(ctx, "long_string", "welcome to educative", 0) 63 subString, _ := client.GetRange(ctx, "long_string", 0, 6).Result() 64 log.Println("subString=", subString) 65}
...
Redis 中的键值对

创建哈希的不同方式

1client.HSet(ctx, "user:1", "name", "user1", "email", "user1@foo.com").Result() 2client.HSet(ctx, "user:2", []string{"name", "user2", "email", "user2@foo.com"}).Result() 3client.HSet(ctx, "user:3", map[string]string{"name": "user3", "email": "user3@foo.com", "city": "New York"}).Result()

从哈希中获取数据的不同方式

1client.HGet(ctx, "user:1", "name").Result() 2client.HMGet(ctx, "user:2", "name", "email").Result() 3client.HGetAll(ctx, "user:3").Result()

将 HGetAll 结果转换为 Go 结构体 - 手动方式

1type User struct { 2 Email string 3 Name string 4 City string 5} 6 7result := client.HGetAll(ctx, "user:3").Val() 8 9user := User{} 10user.Email = result["email"] 11user.Name = result["name"] 12user.City = result["city"]

使用 Scan 简化转换

1type User struct { 2 Email string `redis:"email"` 3 Name string `redis:"name"` 4 City string `redis:"city"` 5} 6 7var user User 8client.HGetAll(ctx, "user:3").Scan(&user)

获取哈希中的所有键

1keys := client.HKeys(ctx, "user:1").Val() 2log.Println("键 -", keys)
1package main 2 3import ( 4 "context" 5 "errors" 6 "flag" 7 "log" 8 "time" 9 10 "github.com/go-redis/redis/v8" 11) 12 13func main() { 14 client := redis.NewClient(&redis.Options{Addr: "localhost:6379"}) 15 _, err := client.Ping(context.Background()).Result() 16 17 if err != nil { 18 log.Fatal("ping 失败。无法连接", err) 19 } 20 21 hash(client) 22} 23 24func hash(client *redis.Client) { 25 26 ctx := context.Background() 27 28 // 设置 29 _, err := client.HSet(ctx, "user:1", "name", "user1", "email", "user1@foo.com").Result() 30 if err != nil { 31 log.Fatal("HSet 失败", err) 32 } 33 34 _, err = client.HSet(ctx, "user:2", []string{"name", "user2", "email", "user2@foo.com"}).Result() 35 if err != nil { 36 log.Fatal("HSet 失败", err) 37 } 38 39 _, err = client.HSet(ctx, "user:3", map[string]string{"name": "user3", "email": "user3@foo.com", "city": "New York"}).Result() 40 if err != nil { 41 log.Fatal("HSet 失败", err) 42 } 43 44 // 获取 45 name, err := client.HGet(ctx, "user:1", "name").Result() 46 if err != nil { 47 log.Fatal("HGet 失败", err) 48 } 49 log.Println("name=", name) 50 51 vals, err := client.HMGet(ctx, "user:2", "name", "email").Result() 52 if err != nil { 53 log.Fatal("HMGet 失败", err) 54 } 55 56 for _, val := range vals { 57 log.Println("value=", val) 58 } 59 60 kvs, err := client.HGetAll(ctx, "user:3").Result() 61 if err != nil { 62 log.Fatal("HGetAll 失败", err) 63 } 64 65 for k, v := range kvs { 66 log.Println(k, "=", v) 67 } 68 69 // 结构体转换 70 var user User 71 err = client.HGetAll(ctx, "user:3").Scan(&user) 72 if err != nil { 73 log.Fatal("扫描错误") 74 } 75 log.Println("用户信息", user) 76 77 keys := client.HKeys(ctx, "user:1").Val() 78 log.Println("键 -", keys) 79} 80 81type User struct { 82 Email string `redis:"email"` 83 Name string `redis:"name"` 84 City string `redis:"city"` 85}

欢迎!

构建一个用户管理 API