go-redis使用之Hash字典

go-redis Hash操作

–> go-redis List列表操作
–> go-redis String字符串操作

在Redis中,hash哈希被称为字典(dictionary),Redis的字典使用哈希表作为底层实现

hash更适合用来存储对象,例如:user,name:张三,age:18 等。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
func GetRedisClient()*redis.Client{
    return redis.NewClient(&redis.Options{
        Addr:               "localhost:6379",
        Password:           "",
        DB:                 0,
    })
}

// redisHash Hash散列表操作
func redisHashTest(cli *redis.Client){
    // 单个key-value值:HSet/HGet
    cli.HSet("user","name","新垣结衣")
    name1,err:=cli.HGet("user","name").Result()
    if err != nil {
        panic(err)
    }
    fmt.Printf("name1:%v\n",name1)  // 新垣结衣

    // 多个key-value值:HMSet、HMGet
    m:=make(map[string]interface{})
    m["age"]=18
    m["address"]="Japan"
    str,err:=cli.HMSet("user",m).Result()
    if err != nil {
        panic(err)
    }
    fmt.Println(str)    // ok
    s1,err:=cli.HMGet("user","name","age","address").Result()
    if err != nil {
        panic(err)
    }
    for _, v := range s1 {
        fmt.Println(v)  // 新垣结衣 18 Japan
    }

    // 获取hash中的全部数据
    m1,err:=cli.HGetAll("user").Result()
    if err != nil {
        panic(err)
    }
    for k, v := range m1 {
        fmt.Printf("key:%v value:%v\n",k,v)
        //key:name value:新垣结衣
        //key:age value:18
        //key:address value:Japan
    }

    // 获取所有key
    s2,err:=cli.HKeys("user").Result()
    if err != nil {
        panic(err)
    }
    for _, s := range s2 {
        fmt.Println(s)  // [name age    address]
    }

    // 获取所有value
    s3,err:=cli.HVals("user").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println(s3)     // [新垣结衣 18 Japan]

    // 删除hash中指定的key,对应的value也就没了(可以同时删除多个)
    cli.HDel("user","address","age")
    fmt.Println(cli.HGetAll("user").Val())  // map[name:新垣结衣]

    //获取Hash的内容长度
    n:=cli.HLen("user").Val()
    fmt.Printf("长度为:%d\n",n)    // 长度为:1

    //判断hash中是否存在指定的key
    b1:=cli.HExists("user","name").Val()        //true
    b2:=cli.HExists("user","hobby").Val()   //flase
    fmt.Println(b1,b2)

    // HSetNX:保存一个key-value,如果存在field,则失败,不存在新建并存储
    fmt.Println(cli.HGetAll("user").Val())
    b3,err:=cli.HSetNX("user","name","石原里美").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println(b3) // false 保存失败
    b4,err:=cli.HSetNX("user","city","北京").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println(b4) // true 保存成功
    fmt.Println(cli.HGetAll("user").Val())  // map[city:北京 name:新垣结衣]

}

func main(){
    rdb:=GetRedisClient()
    defer rdb.Close()
    pong:=rdb.Ping().Val()
    fmt.Printf("数据连接状态:%v\n",pong)    // 数据连接状态:PONG

    // redisStringTest(rdb)

    // redisListTest(rdb)

    redisHashTest(rdb)
}