欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go語(yǔ)言實(shí)現(xiàn)的memcache協(xié)議服務(wù)的方法

 更新時(shí)間:2015年03月10日 12:17:33   作者:小囧  
這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)的memcache協(xié)議服務(wù)的方法,實(shí)例分析了Go語(yǔ)言使用memcache的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了go語(yǔ)言實(shí)現(xiàn)的memcache協(xié)議服務(wù)的方法。分享給大家供大家參考。具體如下:

完整實(shí)例代碼點(diǎn)擊此處本站下載。

1. Go語(yǔ)言代碼如下:

復(fù)制代碼 代碼如下:
package memcachep
import (
    "bufio"
    "fmt"
    "io"
    "strconv"
    "strings"
)
//mc請(qǐng)求產(chǎn)生一個(gè)request對(duì)象
type MCRequest struct {
    //請(qǐng)求命令
    Opcode CommandCode
    //key
    Key string
    //請(qǐng)求內(nèi)容
    Value []byte
    //請(qǐng)求標(biāo)識(shí)
    Flags int
    //請(qǐng)求內(nèi)容長(zhǎng)度
    Length int
    //過(guò)期時(shí)間
    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請(qǐng)求內(nèi)容 解析為一個(gè)MCRequest對(duì)象
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語(yǔ)言代碼:
復(fù)制代碼 代碼如下:
package memcachep
import (
    "fmt"
    "io"
)
type MCResponse struct {
    //命令
    Opcoed CommandCode
    //返回狀態(tài)
    Status Status
    //key
    Key string
    //返回內(nèi)容
    Value []byte
    //返回標(biāo)識(shí)
    Flags int
    //錯(cuò)誤
    Fatal bool
}
//解析response 并把返回結(jié)果寫(xiě)入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語(yǔ)言代碼如下:
復(fù)制代碼 代碼如下:
package memcachep
import (
    "fmt"
)
type action func(req *MCRequest, res *MCResponse)
var actions = map[CommandCode]action{
    STATS: StatsAction,
}
//等待分發(fā)處理
func waitDispatch(rc chan chanReq) {
    for {
        input := <-rc
        input.response <- dispatch(input.request)
    }
}
//分發(fā)請(qǐng)求到響應(yīng)的action操作函數(shù)上去
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)
}

希望本文所述對(duì)大家的Go語(yǔ)言程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • golang搭建靜態(tài)web服務(wù)器的實(shí)現(xiàn)方法

    golang搭建靜態(tài)web服務(wù)器的實(shí)現(xiàn)方法

    這篇文章主要介紹了golang搭建靜態(tài)web服務(wù)器的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 使用go語(yǔ)言將單反斜杠改為雙反斜杠的方法

    使用go語(yǔ)言將單反斜杠改為雙反斜杠的方法

    最近開(kāi)發(fā)的時(shí)候遇到這么個(gè)問(wèn)題,就是在window上獲取了文件目錄的字段,然后將這個(gè)絕對(duì)路徑保存到數(shù)據(jù)庫(kù),但是前端展示的時(shí)候路徑的雙反斜杠變成了單反斜杠,本文給大家介紹了使用go語(yǔ)言將單反斜杠改為雙反斜杠的方法,需要的朋友可以參考下
    2024-01-01
  • golang中判斷請(qǐng)求是http還是https獲取當(dāng)前訪問(wèn)地址

    golang中判斷請(qǐng)求是http還是https獲取當(dāng)前訪問(wèn)地址

    這篇文章主要為大家介紹了golang中判斷請(qǐng)求是http還是https獲取當(dāng)前訪問(wèn)地址示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • go語(yǔ)言錯(cuò)誤處理基本概念(創(chuàng)建返回)

    go語(yǔ)言錯(cuò)誤處理基本概念(創(chuàng)建返回)

    這篇文章主要為大家介紹了go語(yǔ)言錯(cuò)誤處理基本概念(創(chuàng)建返回),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 詳解golang的切片擴(kuò)容機(jī)制

    詳解golang的切片擴(kuò)容機(jī)制

    golang的切片擴(kuò)容機(jī)制是golang面試者繞不開(kāi)的一扇大門(mén),無(wú)論在面試提問(wèn),或者面試情景上都繞不開(kāi)它,今天就說(shuō)說(shuō)我理解下的切片擴(kuò)容機(jī)制,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-07-07
  • Go?多環(huán)境下配置管理方案(多種方案)

    Go?多環(huán)境下配置管理方案(多種方案)

    這篇文章主要介紹了Go?多環(huán)境下配置管理方案,方案一配置文件管理,方案二集中式管理配置,每種方案給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Go語(yǔ)言文件讀取的一些總結(jié)

    Go語(yǔ)言文件讀取的一些總結(jié)

    這篇文章主要介紹了Go語(yǔ)言文件讀取的一些總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫(kù)操作示例詳解

    實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫(kù)操作示例詳解

    這篇文章主要為大家介紹了實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫(kù)操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解golang中的method

    詳解golang中的method

    這篇文章主要介紹了golang中的method的相關(guān)資料,幫助大家更好的理解和使用golang,感興趣的朋友可以了解下
    2021-01-01
  • golang文件內(nèi)容覆蓋問(wèn)題的分析及解決

    golang文件內(nèi)容覆蓋問(wèn)題的分析及解決

    通過(guò)golang讀取數(shù)據(jù)庫(kù)站點(diǎn)映射配置,生成nginx conf文件,并檢查和重啟nginx服務(wù),已達(dá)到站點(diǎn)自動(dòng)化部署目的,當(dāng)目標(biāo)文件中內(nèi)容很長(zhǎng),而寫(xiě)入的內(nèi)容很短時(shí),目標(biāo)文件內(nèi)容無(wú)法完全覆蓋,本文給大家介紹了解決方法,需要的朋友可以參考下
    2024-01-01

最新評(píng)論