-
Notifications
You must be signed in to change notification settings - Fork 0
/
strings.go
153 lines (124 loc) · 4.19 KB
/
strings.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
package redis
import (
"strconv"
)
// Append 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作
func (client *Client) Append(key string, value []byte) (err error) {
_, err = client.sendCommand("APPEND", string(value))
return
}
// Decr 对key对应的数字做减1操作
func (client *Client) Decr(key string) (int64, error) {
data, err := client.sendCommand("DECR", key)
if err != nil {
return -1, err
}
return data.(int64), nil
}
// DecrBy 将key对应的数字减decrement
func (client *Client) DecrBy(key string, decrement int64) (int64, error) {
data, err := client.sendCommand("DECRBY", key, strconv.FormatInt(decrement, 10))
if err != nil {
return -1, err
}
return data.(int64), nil
}
// Get 返回key的value。如果key不存在,返回特殊值nil。如果key的value不是string,就返回错误,因为GET只处理string类型的values。
func (client *Client) Get(key string) ([]byte, error) {
data, _ := client.sendCommand("GET", key)
if data == nil {
return nil, RedisError("Key `" + key + "` does not exist")
}
return data.([]byte), nil
}
// GetSet 自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。
func (client *Client) GetSet(key string, val []byte) ([]byte, error) {
data, err := client.sendCommand("GETSET", key, string(val))
if err != nil {
return nil, err
}
return data.([]byte), nil
}
// Incr 对存储在指定key的数值执行原子的加1操作
func (client *Client) Incr(key string) (int64, error) {
data, err := client.sendCommand("INCR", key)
if err != nil {
return -1, err
}
return data.(int64), nil
}
// IncrBy 将key对应的数字加decrement
func (client *Client) IncrBy(key string, decrement int64) (int64, error) {
data, err := client.sendCommand("INCRBY", key, strconv.FormatInt(decrement, 10))
if err != nil {
return -1, err
}
return data.(int64), nil
}
// Mget 返回所有指定的key的value
func (client *Client) Mget(keys ...string) ([][]byte, error) {
data, err := client.sendCommand("MGET", keys...)
if err != nil {
return nil, err
}
return data.([][]byte), nil
}
// Mset 对应给定的keys到他们相应的values上。MSET会用新的value替换已经存在的value,就像普通的SET命令一样。
func (client *Client) Mset(mapping map[string][]byte) (err error) {
args := make([]string, len(mapping)*2)
i := 0
for k, v := range mapping {
args[i] = k
args[i+1] = string(v)
i += 2
}
_, err = client.sendCommand("MSET", args...)
return
}
// Msetnx 对应给定的keys到他们相应的values上。只要有一个key已经存在,MSETNX一个操作都不会执行。
func (client *Client) Msetnx(mapping map[string][]byte) (flag bool, err error) {
args := make([]string, len(mapping)*2)
i := 0
flag = false
for k, v := range mapping {
args[i] = k
args[i+1] = string(v)
i += 2
}
res, err := client.sendCommand("MSETNX", args...)
if err != nil {
return
}
if data, ok := res.(int64); ok {
flag = (data == 1)
return
}
return
}
// Set 将键key设定为指定的“字符串”值。如果 key 已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。
func (client *Client) Set(key string, val []byte) error {
_, err := client.sendCommand("SET", key, string(val))
if err != nil {
return err
}
return nil
}
// Setex 设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期。
func (client *Client) Setex(key string, seconds int64, val []byte) error {
_, err := client.sendCommand("SETEX", strconv.FormatInt(seconds, 10), string(val))
if err != nil {
return err
}
return nil
}
// Setnx 将key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做。
func (client *Client) Setnx(key string, val []byte) (bool, error) {
res, err := client.sendCommand("SETNX", key, string(val))
if err != nil {
return false, err
}
if data, ok := res.(int64); ok {
return data == 1, nil
}
return false, RedisError("Unexpected reply to MSETNX")
}