当前位置: 首页 > 编程笔记 >

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

章飞虎
2023-03-14
本文向大家介绍go语言实现的memcache协议服务的方法,包括了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语言程序设计有所帮助。

 类似资料:
  • 本文向大家介绍go语言实现简单http服务的方法,包括了go语言实现简单http服务的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言实现简单http服务的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Go语言程序设计有所帮助。

  • 本文向大家介绍Go语言实现简单Web服务器的方法,包括了Go语言实现简单Web服务器的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言实现简单Web服务器的方法。分享给大家供大家参考。具体分析如下: 包 http 通过任何实现了 http.Handler 的值来响应 HTTP 请求: package http type Handler interface { ServeHTTP

  • 本文向大家介绍Go语言Echo服务器的方法,包括了Go语言Echo服务器的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言Echo服务器的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的Go语言程序设计有所帮助。

  • 本文向大家介绍Go语言Telnet回音服务器的实现,包括了Go语言Telnet回音服务器的实现的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Go语言Telnet回音服务器,分享给大家,具体如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍go语言实现sqrt的方法,包括了go语言实现sqrt的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言实现sqrt的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Go语言程序设计有所帮助。

  • 本文向大家介绍Go语言实现的一个简单Web服务器,包括了Go语言实现的一个简单Web服务器的使用技巧和注意事项,需要的朋友参考一下 Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由,静态文件,模版,cookie等数据进行设置和操作。 http包建立Web服务器 上