彬哥笔记 --16 Go语言 游戏服务器缓存库举例

      大家好,我是彬哥,本节给大家讲下go语言服务器游戏缓存处理相关,抛砖引玉了,主要是针对Go语言游戏服务器开发缓存如何处理。
首选我们来看下LollipopGo v1.0.20190104 版本的处理,缓存使用cache2go;
github地址

官方代码例子如下:

package main

import (
    "github.com/muesli/cache2go"
    "fmt"
    "time"
)
// Keys & values in cache2go can be of arbitrary types, e.g. a struct.
type myStruct struct {
    text     string
    moreData []byte
}
func main() {
    // Accessing a new cache table for the first time will create it.
    cache := cache2go.Cache("myCache")
    // We will put a new item in the cache. It will expire after
    // not being accessed via Value(key) for more than 5 seconds.
    val := myStruct{"This is a test!", []byte{}}
    cache.Add("someKey", 5*time.Second, &val)
    // Let's retrieve the item from the cache.
    res, err := cache.Value("someKey")
    if err == nil {
        fmt.Println("Found value in cache:", res.Data().(*myStruct).text)
    } else {
        fmt.Println("Error retrieving value from cache:", err)
    }
    // Wait for the item to expire in cache.
    time.Sleep(6 * time.Second)
    res, err = cache.Value("someKey")
    if err != nil {
        fmt.Println("Item is not cached (anymore).")
    }
    // Add another item that never expires.
    cache.Add("someKey", 0, &val)
    // cache2go supports a few handy callbacks and loading mechanisms.
    cache.SetAboutToDeleteItemCallback(func(e *cache2go.CacheItem) {
        fmt.Println("Deleting:", e.Key(), e.Data().(*myStruct).text, e.CreatedOn())
    })
    // Remove the item from the cache.
    cache.Delete("someKey")
    // And wipe the entire cache table.
    cache.Flush()
}

社区测试修改缓存例子,代码如下:

package main

import (
    "cache2go"
    "fmt"
)

var cache *cache2go.CacheTable
var SaveChessData map[int]*GolangLtd

type GolangLtd struct {
    RoomUID   int
    PlayerA   string
    PlayerB   string
    Default   [4][4]int
    ChessData [4][4]int
}

func init() {
    cache = cache2go.Cache("myCache")
    SaveChessData = make(map[int]*GolangLtd)
    return
}

//------------------------------------------------------------------------------

func main() {

    data11 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
    data1 := [4][4]int{{17, 17, 17, 17}, {17, 17, 17, 17}, {17, 17, 17, 17}, {17, 17, 17, 17}}
    re := InitDSQ(data11)

    data := &GolangLtd{
        RoomUID:   1,
        PlayerB:   "987654321",
        Default:   data1,
        ChessData: re,
    }

    SaveChessData[1] = data
    // 保存数据
    cache.Add(111, 0, data)
    // 获取数据
    res, err1 := cache.Value(111)
    if err1 != nil {
        fmt.Println(err1)
        return
    }
    //--------------------------------------------------------------------------
    fmt.Println("result:", res.Data().(*GolangLtd).RoomUID)
    res.Data().(*GolangLtd).RoomUID = 2
    fmt.Println("result:", res.Data().(*GolangLtd).RoomUID)
    //--------------------------------------------------------------------------
    fmt.Println("result:", res.Data().(*GolangLtd).Default)
    fmt.Println("result:", res.Data().(*GolangLtd).Default[1][2])
    res.Data().(*GolangLtd).Default[1][2] = 18
    fmt.Println("result:", res.Data().(*GolangLtd).Default)
    fmt.Println("result:", res.Data().(*GolangLtd).PlayerA)
    //--------------------------------------------------------------------------
}

运行结果

LollipopGo 子游戏服务器使用,代码如下:

定义变量:

var cacheDSQ *cache2go.CacheTable

初始化:

func initDSQNetRPC() {
    client, err := jsonrpc.Dial("tcp", service)
    if err != nil {
        log.Debug("dial error:", err)
    }
    ConnDSQRPC = client
    cacheDSQ = cache2go.Cache("LollipopGo_DSQ")
}

测试逻辑,代码如下:

//------------------------------------------------------------------------------

func CacheSaveRoomData(iRoomID int, data *RoomPlayerDSQ, openid string) {
    cacheDSQ.Add(iRoomID, 0, data)
    CacheSavePlayerUID(iRoomID, openid)
}

func CacheGetPlayerUID(iRoomID int, player string) string {
    res, err1 := cacheDSQ.Value(iRoomID)
    if err1 != nil {
        panic("没有对应数据")
        return ""
    }
    if res.Data().(*RoomPlayerDSQ).OpenIDA == player {
        return res.Data().(*RoomPlayerDSQ).OpenIDB
    } else {
        return res.Data().(*RoomPlayerDSQ).OpenIDA
    }
    return ""
}

func CacheSavePlayerUID(iRoomID int, player string) {
    res, err1 := cacheDSQ.Value(iRoomID)
    if err1 != nil {
        panic("没有对应数据")
        return
    }
    fmt.Println("result:", res.Data().(*RoomPlayerDSQ).OpenIDA)
    fmt.Println("result:", res.Data().(*RoomPlayerDSQ).OpenIDB)
    if len(res.Data().(*RoomPlayerDSQ).OpenIDA) == 0 {
        res.Data().(*RoomPlayerDSQ).OpenIDA = player
    } else {
        res.Data().(*RoomPlayerDSQ).OpenIDB = player
    }
    fmt.Println("result:", res.Data().(*RoomPlayerDSQ).OpenIDA)
    fmt.Println("result:", res.Data().(*RoomPlayerDSQ).OpenIDB)
    return
}

func CacheUpdateRoomData(iRoomID int, Update_pos string, value int) {

    res, err1 := cacheDSQ.Value(iRoomID)
    if err1 != nil {
        panic("棋盘数据更新失败!")
        return
    }

    ipos_x := 0
    ipos_y := 0
    strsplit := Strings_Split(Update_pos, ",")
    if len(strsplit) != 2 {
        panic("棋盘数据更新失败!")
        return
    }
    for i := 0; i < len(strsplit); i++ {
        if i == 0 {
            ipos_x = util.Str2int_LollipopGo(strsplit[i])
        } else {
            ipos_y = util.Str2int_LollipopGo(strsplit[i])
        }
    }
    fmt.Println("修改的棋盘的坐标", ipos_x, ipos_y)
    // 测试数据
    fmt.Println("result:", res.Data().(*RoomPlayerDSQ).ChessData[ipos_x][ipos_y])
    res.Data().(*RoomPlayerDSQ).ChessData[ipos_x][ipos_y] = value
    fmt.Println("result:", res.Data().(*RoomPlayerDSQ).ChessData[ipos_x][ipos_y])
    return
}

// 获取默认棋牌数据是否翻开
// true 表示翻开了
// itype ==1 查询是否翻开
// itype ==2 修改数据
func CacheGetChessDefaultData(iRoomID int, Update_pos string, itype int, valve int) (bool, int) {
    res, err1 := cacheDSQ.Value(iRoomID)
    if err1 != nil {
        panic("棋盘数据获取数据失败!")
        return false, -1
    }
    ipos_x := 0
    ipos_y := 0
    strsplit := Strings_Split(Update_pos, ",")
    if len(strsplit) != 2 {
        panic("棋盘数据获取数据失败!")
        return false, -1
    }
    for i := 0; i < len(strsplit); i++ {
        if i == 0 {
            ipos_x = util.Str2int_LollipopGo(strsplit[i])
        } else {
            ipos_y = util.Str2int_LollipopGo(strsplit[i])
        }
    }
    fmt.Println("修改的棋盘的坐标", ipos_x, ipos_y)
    if itype == 1 {
        // 获取
        fmt.Println("result:", res.Data().(*RoomPlayerDSQ).Default[ipos_x][ipos_y])
        idata := res.Data().(*RoomPlayerDSQ).Default[ipos_x][ipos_y]
        if idata == (2*Proto2.Mouse + 1) {
            return false, -1
        } else {
            return true, -1
        }
    } else if itype == 2 {
        // 修改翻盘结构
        fmt.Println("result:", res.Data().(*RoomPlayerDSQ).Default[ipos_x][ipos_y])
        res.Data().(*RoomPlayerDSQ).Default[ipos_x][ipos_y] = valve
        return true, res.Data().(*RoomPlayerDSQ).ChessData[ipos_x][ipos_y]
    }
    return false, -1
}
//------------------------------------------------------------------------------

社区交流群:221273219
Golang语言社区论坛 :
www.Golang.Ltd
LollipopGo游戏服务器地址:
https://github.com/Golangltd/LollipopGo
社区视频课程课件GIT地址:
https://github.com/Golangltd/codeclass


Golang语言社区
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容