search.png
关于我
menu.png
godis 运行原生redis命令

我们可能会遇到需要运行的某些命令在godis中不存在的情况,这个时候我们可以使用其原生的方式运行命令,为了方便使用,封装了一个方法,用于简化这个过程。需要注意的是,执行命令的返回结果返回的是interface{},需要对其进行解析成可读的实体结构。

传递的参数logger是用来打印日志的:

// RunRedisCmd 运行redis命令
func RunRedisCmd(redis *godis.Redis, logger *log.Logger, cmd string, args ...string) (interface{}, error) {
    byteArr := make([][]byte, len(args))
    cmdStr := cmd
    for i, str := range args {
        byteArr[i] = []byte(str)
        cmdStr += fmt.Sprint(" ", str)
    }
    if logger != nil {
        logger.Println(cmdStr)
    }
    err := redis.SendByStr(cmd, byteArr...)
    if err != nil {
        if logger != nil {
            logger.Println(err)
        }
        return nil, err
    }
    // 一定要receive
    r, err := redis.Receive()
    if err != nil {
        if logger != nil {
            logger.Println(err)
        }
        return r, err
    }
    if logger != nil {
        if r != nil {
            switch r.(type) {
            case []byte:
                logger.Println(string(r.([]byte)))
            case int64:
                logger.Println(r.(int64))
            case []interface{}:
                logger.Println("\n", SprintArrAsRedis(0, r.([]interface{})))
            default:
                logger.Println(r)
            }
        } else {
            logger.Println(r)
        }
    }
    return r, nil
}

// SprintArrAsRedis 打印redis返回的数组格式的数据,以redis的方式
//
// 127.0.0.1:16379> xrange testStream - +
//
// 1) 1) "1650986325904-0"
//    2) 1) "msg"
//       2) "hello"
func SprintArrAsRedis(spaceSize int, result []interface{}) string {
    str := ""
    for i, data := range result {
        if i != 0 {
            for j := 0; j < spaceSize; j++ {
                str += " "
            }
        }
        str += fmt.Sprintf("%d) ", i+1)
        markArr := false
        switch data.(type) {
        case []byte:
            str += string(data.([]byte))
        case []interface{}:
            str += SprintArrAsRedis(spaceSize+3, data.([]interface{}))
            markArr = true
        default:
            str += fmt.Sprint(data)
        }
        if !markArr {
            str += "\n"
        }
    }

    return str
}


单元测试:

package test

import (
    "github.com/piaohao/godis"
    "log"
    "momo/utils"
    "os"
    "testing"
    "time"
)

func Test_RunRedisCmd(t *testing.T) {
    option := &godis.Option{
        Host:              "localhost",
        Port:              16379,
        Db:                0,
        ConnectionTimeout: 10 * time.Second,
        SoTimeout:         10 * time.Second,
    }
    pool := godis.NewPool(&godis.PoolConfig{}, option)
    redis, _ := pool.GetResource()

    logger := log.New(os.Stdout, "redis log ", log.Ldate|log.Lmicroseconds|log.Lshortfile)

    rsl, err := utils.RunRedisCmd(redis, logger, "set", "userage", "1")
    if err != nil || rsl == nil || string(rsl.([]byte)) != "OK" {
        t.Error("fail set", err)
    }

    rsl, err = utils.RunRedisCmd(redis, logger, "incr", "userage")
    if err != nil || rsl == nil || rsl.(int64) != 2 {
        t.Error("fail incr", err)
    }

    rsl, err = utils.RunRedisCmd(redis, logger, "del", "userage")
    if err != nil || rsl == nil || rsl.(int64) != 1 {
        t.Error("fail del", err)
    }
}

版权声明

知识共享许可协议 本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
发布时间:2022年05月01日 10:39:06

评论区#

还没有评论哦,期待您的评论!

关闭特效