美文网首页
Go语言获取Redis数据转换为protobuf格式以Json格

Go语言获取Redis数据转换为protobuf格式以Json格

作者: xyj710 | 来源:发表于2017-12-21 11:11 被阅读837次

    我的第一个go程序

    package main
    
    import (
        "fmt"
        "github.com/go-redis/redis"
        "github.com/golang/protobuf/proto"
        "github.com/user/appcpi/game/protobuf/game_data"
        "os"
        "log"
        //"unsafe"
        "encoding/json"
    )
    
    func checkFile(filename string) {
        _, err := os.Stat(filename)
        if err == nil {
            os.Remove(filename)
        }
    
    }
    
    func createFileAndWrite(filename string, data []byte) {
        checkFile(filename)
        file, err := os.Create(filename)
        if err != nil {
            log.Fatal("create %s err:%s \n", filename, err)
        }
        file.Write(data)
        /*if err != nil {
            log.Fatal("write len(data)=%d err:%s \n", data, err)
        }*/
        file.Close()
    }
    
    func parseGameProto(data string) []byte{
        game_data := &APPCPI_GAME.GameData{}
        err := proto.Unmarshal([]byte(data), game_data)
        if err != nil {
            log.Fatal("GameData Unmarshal err: %s\n", err)
        }
    
        result, err := json.MarshalIndent(game_data, "", "    ")
        if err != nil {
            log.Fatal("GameData arshalIndent err: %s\n", err)
        }
    
        return result
    }
    
    func parseTicketProto(data string) []byte{
        ticket := &APPCPI_GAME.TicketInfo{}
        err := proto.Unmarshal([]byte(data), ticket)
        if err != nil {
            log.Fatal("ticket Unmarshal err: %s\n", err)
        }
    
        result, err := json.MarshalIndent(ticket, "", "    ")
        if err != nil {
            log.Fatal("ticket arshalIndent err: %s\n", err)
        }
        return result
    }
    
    func getRecord(client *redis.Client, id string) {
        data, err := client.HGetAll(id).Result()
        if err != nil {
            log.Fatal("HGetAll(%s) err: %s\n", id, err)
        }
        for k,v := range(data) {
            fmt.Printf("k:%s len(v):%d\n", k, len(v))
            if k == "game" {
                createFileAndWrite(id + "_game.txt", parseGameProto(v))
    
            } else if k == "ticket" {
                createFileAndWrite(id + "_ticket.txt", parseTicketProto(v))
            }
        }
    }
    
    func main() {
    
        argv := os.Args[1:]
        if len(argv) < 1 {
            fmt.Printf("Usage:%s [user_id] {IP} {PORT}\n", os.Args[0])
            os.Exit(0)
        }
    
        var Addr string
        if len(argv) >= 3 {
            Addr += argv[1]
            Addr += ":"
            Addr += argv[2]
        } else {
            Addr = "127.0.0.1:7003"
        }
    
        client := redis.NewClient(&redis.Options{
            Addr:     Addr,
            Password: "", // no password set
            DB:       0,  // use default DB
        })
    
        //fmt.Printf("type:%s\n", unsafe.Sizeof(client))
    
        _, err := client.Ping().Result()
        if err != nil {
            log.Fatal("redis ping err:%s \n", err)
        }
        //fmt.Println(pong, err)
        getRecord(client, argv[0])
    }
    

    解释

    1. 从输入获取要查找的键值及Redis的IP和Port
    2. 连接Redis
    3. 从Redis获取Hash数据
    4. 将Hash数据根据Key,处理相应的value,将其转换成Proto格式
    5. 将Proto格式以转换成可阅读的格式输出到文件

    技术点

    1. Redis操作
    2. Protobuf操作
    3. 文件操作
    4. 其他基本操作

    go新手,有疑问的可以评论共同学习。。

    相关文章

      网友评论

          本文标题:Go语言获取Redis数据转换为protobuf格式以Json格

          本文链接:https://www.haomeiwen.com/subject/bhgowxtx.html