• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    go语言实现的memcache协议服务的方法

    本文实例讲述了go语言实现的memcache协议服务的方法。分享给大家供大家参考。具体如下:

    完整实例代码点击此处本站下载。

    1. Go语言代码如下:

    复制代码 代码如下:
    package memcachep
    import (
        "bufio"
        "fmt"
        "io"
        "strconv"
        "strings"
    )
    //mc请求产生一个request对象
    type MCRequest struct {
        //请求命令
        Opcode CommandCode
        //key
        Key string
        //请求内容
        Value []byte
        //请求标识
        Flags int
        //请求内容长度
        Length int
        //过期时间
        Expires int64
    }
    //request to string
    func (req *MCRequest) String() string {
        return fmt.Sprintf("{MCRequest opcode=%s, bodylen=%d, key='%s'}",
            req.Opcode, len(req.Value), req.Key)
    }
    //将socket请求内容 解析为一个MCRequest对象
    func (req *MCRequest) Receive(r *bufio.Reader) error {
        line, _, err := r.ReadLine()
        if err != nil || len(line) == 0 {
            return io.EOF
        }
        params := strings.Fields(string(line))
        command := CommandCode(params[0])
        switch command {
        case SET, ADD, REPLACE:
            req.Opcode = command
            req.Key = params[1]
            req.Length, _ = strconv.Atoi(params[4])
            value := make([]byte, req.Length+2)
            io.ReadFull(r, value)
            req.Value = make([]byte, req.Length)
            copy(req.Value, value)
        case GET:
            req.Opcode = command
            req.Key = params[1]
            RunStats["cmd_get"].(*CounterStat).Increment(1)
        case STATS:
            req.Opcode = command
            req.Key = ""
        case DELETE:
            req.Opcode = command
            req.Key = params[1]
        }
        return err
    }

    2. Go语言代码:
    复制代码 代码如下:
    package memcachep
    import (
        "fmt"
        "io"
    )
    type MCResponse struct {
        //命令
        Opcoed CommandCode
        //返回状态
        Status Status
        //key
        Key string
        //返回内容
        Value []byte
        //返回标识
        Flags int
        //错误
        Fatal bool
    }
    //解析response 并把返回结果写入socket链接
    func (res *MCResponse) Transmit(w io.Writer) (err error) {
        switch res.Opcoed {
        case STATS:
            _, err = w.Write(res.Value)
        case GET:
            if res.Status == SUCCESS {
                rs := fmt.Sprintf("VALUE %s %d %d\r\n%s\r\nEND\r\n", res.Key, res.Flags, len(res.Value), res.Value)
                _, err = w.Write([]byte(rs))
            } else {
                _, err = w.Write([]byte(res.Status.ToString()))
            }
        case SET, REPLACE:
            _, err = w.Write([]byte(res.Status.ToString()))
        case DELETE:
            _, err = w.Write([]byte("DELETED\r\n"))
        }
        return
    }

    3. Go语言代码如下:
    复制代码 代码如下:
    package memcachep
    import (
        "fmt"
    )
    type action func(req *MCRequest, res *MCResponse)
    var actions = map[CommandCode]action{
        STATS: StatsAction,
    }
    //等待分发处理
    func waitDispatch(rc chan chanReq) {
        for {
            input := -rc
            input.response - dispatch(input.request)
        }
    }
    //分发请求到响应的action操作函数上去
    func dispatch(req *MCRequest) (res *MCResponse) {
        if h, ok := actions[req.Opcode]; ok {
            res = MCResponse{}
            h(req, res)
        } else {
            return notFound(req)
        }
        return
    }
    //未支持命令
    func notFound(req *MCRequest) *MCResponse {
        var response MCResponse
        response.Status = UNKNOWN_COMMAND
        return response
    }
    //给request绑定上处理程序
    func BindAction(opcode CommandCode, h action) {
        actions[opcode] = h
    }
    //stats
    func StatsAction(req *MCRequest, res *MCResponse) {
        res.Fatal = false
        stats := ""
        for key, value := range RunStats {
            stats += fmt.Sprintf("STAT %s %s\r\n", key, value)
        }
        stats += "END\r\n"
        res.Value = []byte(stats)
    }

    希望本文所述对大家的Go语言程序设计有所帮助。

    您可能感兴趣的文章:
    • golang简单tls协议用法完整示例
    • GO语言实现简单TCP服务的方法
    • Go语言服务器开发之简易TCP客户端与服务端实现方法
    • Go语言基于Socket编写服务器端与客户端通信的实例
    • go语言实现一个简单的http客户端抓取远程url的方法
    • Go语言服务器开发之客户端向服务器发送数据并接收返回数据的方法
    • Golang实现的聊天程序服务端和客户端代码分享
    • golang实现简单的udp协议服务端与客户端示例
    上一篇:Windows下使用go语言写程序安装配置实例
    下一篇:Go语言实现简单Web服务器的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    go语言实现的memcache协议服务的方法 语言,实现,的,memcache,协议,