1.客户端介绍

redis官网推荐使用redigo(https://github.com/gomodule/redigo),截止到今天Github Start是8.2kgo-redis(https://github.com/go-redis/redis)使用的人更多, 并且go-redis封装得更好。截止到今天Github Start 是10.8k

2.安装

1
go get github.com/go-redis/redis/v8

3.编写配置

3.1 编写配置文件

文件:app/config/*.ini

1
2
3
4
5
6
7
8
9
...
[redis]
host=127.0.0.1
port=6379
# 密码
password=
# 默认DB
default_db=0
...

3.2 编写Redis配置结构

文件:app/config/config.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/**
 * @description: Redis配置信息
 * @user: Shershon
 */
type RedisConfig struct {
    Host      string `ini:"host"`
    Port      string `ini:"port"`
    DefaultDB string `ini:"default_db"`
    Password  string `ini:"password"`
}

4.初始化客户端

4.1 创建全局Redis客户端

1
var RedisClient  *redis.Client

4.2 建立连接

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/**
 * @description: 连接Redis
 * @user: Shershon
 * @date 2021-02-23 17:06:27
 */
func connectRedis() {
    RedisClient = redis.NewClient(&redis.Options{
        Addr:     RedisConfigInstance.Host + ":" + RedisConfigInstance.Port,
        Password: RedisConfigInstance.Password, // 密码
        DB:       RedisConfigInstance.DefaultDB, // 默认数据库
        PoolSize: RedisConfigInstance.PoolSize, // 连接池大小
    })
    // 设置连接超时时间
    duration, err := time.ParseDuration(RedisConfigInstance.TimeOut)
    ctx, cancelFunc := context.WithTimeout(context.Background(), duration)
    defer cancelFunc()
    result, err := RedisClient.Ping(ctx).Result()
    fmt.Println("redis: " + result)
    BusErrorInstance.ThrowError(err)
}

5.使用

源码文件:https://github.com/shershon1991/goe/blob/master/app/controllers/v1/redis.go

5.1 Set & Get

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var ctx = context.Background()
func (r RedisController) Normal() error  {
    opType := r.GetParam("opType")
    key := r.GetParam("key")
    if opType == "1" {
        // Set
        val := r.GetParam("val")
        err := RedisClient.Set(ctx, key, val, time.Second * 60).Err()
        if err != nil {
            return r.Error("Set: " + err.Error())
        }
        return r.Success(nil)
    } else  {
        // Get
        result, err := RedisClient.Get(ctx, key).Result()
        if err == redis.Nil {
            return r.Error(key + " not exist")
        } else if err != nil {
            return r.Error("Get: " + err.Error())
        }
        return r.Success(result)
    }
}

5.2 有序集合(Sorted Set)

 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
/**
* @description: 有序集合添加
* @user: Shershon
* @receiver r RedisController
*/
func (r RedisController) SortSet() error  {
    opType := r.GetParam("opType")
    key := r.GetParam("key")
    if opType == "1" {
        // 有序集合添加
        zs := []*redis.Z{
            {Member: "小张",Score: 88},
            {Member: "小李",Score: 90},
            {Member: "小明",Score: 80},
            {Member: "小英",Score: 70},
            {Member: "小赵",Score: 95},
            {Member: "小王",Score: 75},
            {Member: "笨蛋",Score: 40},
        }
        result, err := RedisClient.ZAdd(ctx, key, zs...).Result()
        if err != nil {
            return r.Error(err.Error())
        }
        return r.Success(result)
    } else  {
        resultMap := make(map[string]interface{})
        // 获取成员数
        val := RedisClient.ZCard(ctx, key).Val()
        resultMap["获取成员数"] = val
        // 获取指定分数区间的成员数
        resultMap["70分-90分成员数"] = RedisClient.ZCount(ctx, key, "70", "90").Val()
        // 返回有序集中指定分数区间内的成员,分数从高到低排序
        result, _ := RedisClient.ZRevRangeByScoreWithScores(ctx, key, &redis.ZRangeBy{
            Min: "0", Max: "100", Offset: 0, Count: 3,
        }).Result()
        resultMap["分数前三排名"] = result
        // 返回分数值
        f, _ := RedisClient.ZScore(ctx, key, "小张").Result()
        resultMap["小张的分数"] = f
        // 给笨蛋加60分
        f2, err := RedisClient.ZIncrBy(ctx, key, 60.0, "笨蛋").Result()
        fmt.Println(err)
        fmt.Printf("新分数:%v \n",f2)
        result2, _ := RedisClient.ZRevRangeByScoreWithScores(ctx, key, &redis.ZRangeBy{
            Min: "0", Max: "100", Offset: 0, Count: 3,
        }).Result()
        resultMap["调整分后排名"] = result2
        return r.Success(resultMap)
    }

5.3 Hash操作

 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
/**
 * @description: 哈希类型操作
 * @user: Shershon
 * @receiver r RedisController
 * @return error
 */
func (r RedisController) Hash() error {
    //  将哈希表 key 中的字段 field 的值设为 value 。
    opType := r.GetParam("opType")
    result := make(map[string]interface{})
    if opType == "1" {
        // Hset:将哈希表 key 中的字段 field 的值设为 value 。
        err := RedisClient.HSet(ctx, "HSet-key", "field_name", "张三").Err()
        // HmSET:同时将多个 field-value (域-值)对设置到哈希表 key 中。
        err = RedisClient.HMSet(ctx, "HMSet-key", "field1","val1","field2","val2","field3","val3").Err()
        if err != nil {
            return  r.Error(err.Error())
        }
        return  r.Success(nil)
    } else {
        // HEXISTS:查看哈希表key中,指定的字段是否存在。
        res, err := RedisClient.HExists(ctx, "HSet-key", "field_name").Result()
        result["HExists"] = res
        // HGET:获取存储在哈希表中指定字段的值。
        s, err := RedisClient.HGet(ctx, "HMSet-key", "field2").Result()
        result["HGet"] = s
        //HGETALL:获取在哈希表中指定 key 的所有字段和值
        m, err := RedisClient.HGetAll(ctx, "HMSet-key").Result()
        result["HGet"] = m
        // Hkeys:获取所有哈希表中的字段
        strings, err := RedisClient.HKeys(ctx, "HMSet-key").Result()
        result["HKeys"] = strings
        // HVALS:获取哈希表中所有值。
        i, err := RedisClient.HVals(ctx, "HMSet-key").Result()
        result["HVals"] = i
        // HMGET:获取所有给定字段的值
        i2, err := RedisClient.HMGet(ctx, "HMSet-key", "field1", "field2", "field3").Result()
        result["HMGet"] = i2
        if err != nil {
            return  r.Error(err.Error())
        }
        return  r.Success(result)
    }
}

5.4 列表操作(List)

 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
/**
 * @description: 列表类型操作
 * @user: Shershon
 * @receiver r RedisController
 * @return error
 */
func (r RedisController) List() error {
    opType := r.GetParam("opType")
    key := "List:Rows"
    result := make(map[string]interface{})
    if opType == "1" {
        // LPUSH: 将一个或多个值插入到列表头部
        err := RedisClient.LPush(ctx, key, "PHP", "C", "GO", "JAVA", "PYTHON").Err()
        // RPUSH:将一个或多个值插入到列表的尾部
        err = RedisClient.LPush(ctx, key, "C++", "HTML").Err()
        if err != nil {
            return  r.Error(err.Error())
        }
    } else if opType == "2"  {
        // BLPOP:移出并获取列表的第一个元素(阻塞)
        duration, err := time.ParseDuration("10s")
        res, err := RedisClient.BLPop(ctx, duration, key).Result()
        result["BLPOP"] = res
        //BRPOP:移出并获取列表的最后一个元素(阻塞)
        strings, err := RedisClient.BRPop(ctx, duration, key).Result()
        result["BRPop"] = strings
        // LPOP:移出并获取列表的第一个元素
        s, err := RedisClient.LPop(ctx, key).Result()
        result["LPop"] = s
        // RPOP:移除列表的最后一个元素,返回值为移除的元素。
        s2, err := RedisClient.RPop(ctx, key).Result()
        result["RPOP"] = s2
        if err != nil {
            return  r.Error(err.Error())
        }
    } else {
        //LINDEX: 通过索引获取列表中的元素
        s, err := RedisClient.LIndex(ctx, key, 0).Result()
        result["LIndex-0"] = s
        //LRANGE:获取列表指定范围内的元素
        strings, err := RedisClient.LRange(ctx, key, 0, 3).Result()
        result["LRange"] = strings
        if err != nil {
            return  r.Error(err.Error())
        }
    }
    return  r.Success(result)
}