-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathredis.go
170 lines (142 loc) · 4.45 KB
/
redis.go
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package main
import (
"fmt"
"sync"
"time"
"gopkg.in/redis.v4"
)
// 创建 redis 客户端
func createClient() *redis.Client {
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
PoolSize: 1000,
})
pong, err := client.Ping().Result()
fmt.Println(pong, err)
return client
}
// String 操作
func stringOperation(client *redis.Client) {
// 第三个参数是过期时间, 如果是0, 则表示没有过期时间.
err := client.Set("name", "xys", 0).Err()
if err != nil {
panic(err)
}
val, err := client.Get("name").Result()
if err != nil {
panic(err)
}
fmt.Println("name", val)
// 这里设置过期时间.
err = client.Set("age", "20", 1*time.Second).Err()
if err != nil {
panic(err)
}
client.Incr("age") // 自增
client.Incr("age") // 自增
client.Decr("age") // 自减
val, err = client.Get("age").Result()
if err != nil {
panic(err)
}
fmt.Println("age", val) // age 的值为21
// 因为 key "age" 的过期时间是一秒钟, 因此当一秒后, 此 key 会自动被删除了.
time.Sleep(1 * time.Second)
val, err = client.Get("age").Result()
if err != nil {
// 因为 key "age" 已经过期了, 因此会有一个 redis: nil 的错误.
fmt.Printf("error: %v\n", err)
}
fmt.Println("age", val)
}
// list 操作
func listOperation(client *redis.Client) {
client.RPush("fruit", "apple") //在名称为 fruit 的list尾添加一个值为value的元素
client.LPush("fruit", "banana") //在名称为 fruit 的list头添加一个值为value的 元素
length, err := client.LLen("fruit").Result() //返回名称为 fruit 的list的长度
if err != nil {
panic(err)
}
fmt.Println("length: ", length) // 长度为2
value, err := client.LPop("fruit").Result() //返回并删除名称为 fruit 的list中的首元素
if err != nil {
panic(err)
}
fmt.Println("fruit: ", value)
value, err = client.RPop("fruit").Result() // 返回并删除名称为 fruit 的list中的尾元素
if err != nil {
panic(err)
}
fmt.Println("fruit: ", value)
}
// set 操作
func setOperation(client *redis.Client) {
client.SAdd("blacklist", "Obama") // 向 blacklist 中添加元素
client.SAdd("blacklist", "Hillary") // 再次添加
client.SAdd("blacklist", "the Elder") // 添加新元素
client.SAdd("whitelist", "the Elder") // 向 whitelist 添加元素
// 判断元素是否在集合中
isMember, err := client.SIsMember("blacklist", "Bush").Result()
if err != nil {
panic(err)
}
fmt.Println("Is Bush in blacklist: ", isMember)
// 求交集, 即既在黑名单中, 又在白名单中的元素
names, err := client.SInter("blacklist", "whitelist").Result()
if err != nil {
panic(err)
}
// 获取到的元素是 "the Elder"
fmt.Println("Inter result: ", names)
// 获取指定集合的所有元素
all, err := client.SMembers("blacklist").Result()
if err != nil {
panic(err)
}
fmt.Println("All member: ", all)
}
// hash 操作
func hashOperation(client *redis.Client) {
client.HSet("user_xys", "name", "xys") // 向名称为 user_xys 的 hash 中添加元素 name
client.HSet("user_xys", "age", "18") // 向名称为 user_xys 的 hash 中添加元素 age
// 批量地向名称为 user_test 的 hash 中添加元素 name 和 age
client.HMSet("user_test", map[string]string{"name": "test", "age": "20"})
// 批量获取名为 user_test 的 hash 中的指定字段的值.
fields, err := client.HMGet("user_test", "name", "age").Result()
if err != nil {
panic(err)
}
fmt.Println("fields in user_test: ", fields)
// 获取名为 user_xys 的 hash 中的字段个数
length, err := client.HLen("user_xys").Result()
if err != nil {
panic(err)
}
fmt.Println("field count in user_xys: ", length) // 字段个数为2
// 删除名为 user_test 的 age 字段
client.HDel("user_test", "age")
age, err := client.HGet("user_test", "age").Result()
if err != nil {
fmt.Printf("Get user_test age error: %v\n", err)
} else {
fmt.Println("user_test age is: ", age) // 字段个数为2
}
}
// redis.v4 的连接池管理
func connectPool(client *redis.Client) {
wg := sync.WaitGroup{}
wg.Add(3000)
for i := 0; i < 3000; i++ {
go func() {
defer wg.Done()
for j := 0; j < 100; j++ {
client.Set(fmt.Sprintf("name%d", j), fmt.Sprintf("xys%d", j), 0).Err()
client.Get(fmt.Sprintf("name%d", j)).Result()
}
fmt.Printf("PoolStats, TotalConns: %d, FreeConns: %d\n", client.PoolStats().TotalConns, client.PoolStats().FreeConns)
}()
}
wg.Wait()
}