本篇博客记录了使用 golang 操作单点 redis 时的一些示例代码,可以经过改造应用到程序中去。
我们基于 golang-redis 这个库封装了一些函数,作为代码示例,也方便使用。
使用以下代码创建一个 Redis 客户端,需要提供 redis 的地址(IP:Port),密码和数据库索引
1
2
3
4
5
6
7
8
9
|
func NewRedisClient(address string, password string, index int) (*redis.Client, error) {
client := redis.NewClient(&redis.Options{
Addr: address,
Password: password,
DB: index,
})
return client, client.Ping().Err()
}
|
创建永不过期的 key-value
1
2
3
|
func Set(client *redis.Client, key string, value string) error {
return client.Set(key, value, 0).Err()
}
|
创建含过期时间的 key-value
1
2
3
|
func SetWithDuration(client *redis.Client, key string, value string, duration time.Duration) error {
return client.Set(key, value, duration).Err()
}
|
对于 redis,创建和更新的操作效果一样
删除一个 key-value
1
2
3
|
func Delete(client *redis.Client, key string) error {
return client.Del(key).Err()
}
|
删除一组 key-value
1
2
3
|
func DeleteKeys(client *redis.Client, keys ...string) error {
return client.Del(keys...).Err()
}
|
删除 redis 数据库所有数据,使用异步删除,主线程会把删除任务交给异步线程来完成删除任务
1
2
3
|
func DeleteDB(client *redis.Client) error {
return client.FlushAllAsync().Err()
}
|
删除当前 redis 数据库,如果想要删除其他的 redis 数据库,需要构造 map 存储各个 redis 数据库的客户端,想删除指定的数据库时,取出其客户端即可
1
2
3
|
func DeleteCurrentDB(client *redis.Client) error {
return client.FlushDBAsync().Err()
}
|
获取 key-value
1
2
3
|
func Get(client *redis.Client, key string) (string, error) {
return client.Get(key).Result()
}
|
模糊查询 key,此操作有危险性,在数据量大时非常消耗性能
1
2
3
4
5
6
7
8
9
|
func GetByKeyName(client *redis.Client, key string) ([]string, error) {
var values []string
err := client.Keys(fmt.Sprintf("*%s*", key)).ScanSlice(&values)
if err != nil {
return values, err
}
return values, nil
}
|
模糊查询 value,获取所有的 key,然后根据 key 获取 value,再进行筛选,返回由 key-value 组成的 map,此操作会有性能问题,可作为开发和测试环境使用,绝对不能应用于生产环境。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
func GetByValue(client *redis.Client, value string) (map[string]string, error) {
var keys []string
err := client.Keys("*").ScanSlice(&keys)
if err != nil {
return nil, err
}
result := make(map[string]string)
for _, k := range keys {
v, err := client.Get(k).Result()
if err != nil {
continue
}
if strings.Contains(v, value) {
result[k] = v
}
}
return result, nil
}
|
官方 Github 仓库地址
https://github.com/go-redis/redis