skynet简单游戏服务器的迭代

news2025/3/7 1:00:51

上一篇的基础上做了改进,主要三个更新:

  1. 基础框架引入多一层redis缓存,用于持久化数据,加速数据访问。原本需要通过mysql读取的操作,直接改成与redis层交互,redis会自动写入mysql,保证AP 最终一致性。
  2. 引入热更新机制,通过inject指令操作脚本更新全局和local方法
  3. 用C封装实现table没提供的常用操作,比如某个元素是否在table中is_in_table等等几个接口,压测接口500w,性能提高了百分10%左右。

目录结构小调整:

egame  
--cache         redis缓存层机制
--clusters      跨服和游戏服节点服务  
--common        公共方法  
--data          游戏配置  
--db            mysql连接池和redis池服务  
--def           宏定义  
--dungeon       副本功能逻辑  
--event         玩家事件  
--id_create     全局唯一id服务  
--listen        socket服务  
--net           网络协议解析  
--player        玩家服务和逻辑  
--server        节点初始化服务  

主要的3部分调整

第一部分 – 引入redis缓存

用hash类型存储

–key主要有4种:

----第一种:mysql表数据对应的主键

key:index_表名; field:main_index; val:indexList
其中main_index一般是主键,而联合主键的main_index就是联合主键中的主要字段,比如玩家对应多条装备数据,则用玩家id作为main_index
indexList则是对应的主键列表,用table格式序列化成json

----第二种:主键对应的具体数据
key:rec_表名; field:index; val:表行所有数据

----第三种:脏数据,待写入mysql
key:dirty_表名; field:index; val:1(删除);0(写入)

----第四种:清表
key:dirty_truncate_all; field:表名; val:清除类型1(truncate);0(delete)

使用规则

第一步. 添加配置

配置1
尽量把同个功能的表放在同一个配置,一个配置会启动一个服务管理管理数据

  1. 新建模块,cache.conf.cache_模块.lua

  2. 参考cache_dungeon.lua

local cache = {}

function cache.tables()
    return {"mysql表名1", "mysql表名2"...}
end

function cache.table(tab)
    if tab == "mysql表名1" then
        return {
            ["main_index"] = "主要的主键字段,一般玩家id",
            ["index"] = {"完整的主键字段, 联合主键就用逗号隔开"},
            ["field"] = {"所有字段,用逗号隔开"},
            ["json"] = {"table形式等长文本需要json解析的,多个用逗号隔开"}
        }
    elseif tab == "mysql表名2" then
        return {
            ["main_index"] = "player_id",
            ["index"] = {"player_id", "dun_id"},
            ["field"] = {"player_id", "dun_id", "data"},
            ["json"] = {"data"}
        }       
    end
    return nil
end

return cache

配置2
打开cache.cache_config.lua

  1. 添加宏定义
    CACHE_关键字 = 3
  2. 添加索引
    CACHE_关键字 = “cache.conf.cache_模块”

第二步 如何使用

查询,插入/更新,删除,清表操作

    --获取多条表数据(res是table,没数据则为空)
    local res = skynet.call(skynet.localname(".cache.conf.cache_模块"), "lua", "fetch", "mysql表名", "main_index字段值")
    --获取单条表数据(res是table,没数据则为空)
    local res = skynet.call(skynet.localname(".cache.conf.cache_模块"), "lua", "fetch", "mysql表名", "main_index字段值")
    print_table(res[1])


    --插入数据(res对应def.def_error.lua定义的错误码)
    local info = {player_id = 1, dun_id = 1001, data = {1, 2, 3, 4}}
    local res = skynet.call(skynet.localname(".cache.conf.cache_模块"), "lua", "replace", "mysql表名", info)
    log_print(res)

    --更新数据(res对应def.def_error.lua定义的错误码)
    info.data = {1, 2}
    local res = skynet.call(skynet.localname(".cache.conf.cache_模块"), "lua", "replace", "mysql表名", info)
    log_print(res)   


    --删除表对应main_index的多条数据(res对应def.def_error.lua定义的错误码)
    local res = skynet.call(skynet.localname(".cache.conf.cache_模块"), "lua", "delete", "mysql表名", "main_index字段值", "all")
    log_print(res)
    --删除表对应的单条数据(res对应def.def_error.lua定义的错误码)
    local res = skynet.call(skynet.localname(".cache.conf.cache_模块"), "lua", "delete", "mysql表名", "main_index字段值", {"index的字段值1", "index的字段值2"})
    log_print(res)


    --清表 
    ----最后一个参数,1表示用 delete清表;2表示用 truncate清表
    ----(res对应def.def_error.lua定义的错误码)
    local res = skynet.call(skynet.localname(".cache.conf.cache_模块"), "lua", "delete_all", "mysql表名", 1)
    log_print(res)

第二部分 – 引入热更新机制

hotfix_api.lua是热更脚本,有热更内容通过改脚本实现

支持热更的流程步骤:

第一步:服务要引入skynetex,
local skynet = require "skynetex"

第二步:服务初始化用 skynet.dispatchex 代替 skynet.dispatch

第三步:
hotfix_api模块下写热更脚本,CMD.reloads[script_str] = reloadInfo
其中 script_str是对应函数方法的字符串格式
其中 reloadInfo 的格式:

local typeReloadGlobal, typeReloadLocal = 1, 2
local reloadInfo = {
    type = nil,     --热更的方法类型. typeReloadGlobal | typeReloadLocal
    m = nil,        --local方法的模块名
    f = nil         --local方法的方法名
}

第四步:进入节点的debug_console控制台, 找到hotfix服务的地址

第五步:执行热更脚本,格式为:inject :地址 egame/hotfix/hotfix_api.lua

可以参考hotfix_api.lua已有的脚本

第三部分 – C封装table的相关操作
源码在工程目录的lualib-src的lua-tablehelp.c
主要封装了7个接口,对应common.etool中的7个方法
        {"table_len", table_len},
        {"is_in_table", is_in_table},
        {"is_in_table_func", is_in_table_func},
        {"get_in_table", get_in_table}, 
        {"remove_in_table", remove_in_table},
        {"get_in_table_func", get_in_table_func},
        {"print_table", print_table},

额外:

简单练手的搭建,写得粗暴,有问题的话请见谅或反馈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【仿muduo库one thread one loop式并发服务器实现】

文章目录 一、项目介绍1-1、项目总体简介1-2、项目开发环境1-3、项目核心技术1-4、项目开发流程1-5、项目如何使用 二、框架设计2-1、功能模块划分2-1-1、SERVER模块2-1-2、协议模块 2-2、项目蓝图2-2-1、整体图2-2-2、模块关系图2-2-2-1、Connection 模块关系图2-2-2-2、Accep…

服务流程设计和服务或端口重定向及其websocket等应用示例

服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…

【数据库】关系代数

关系代数 一、关系代数的概念二、关系代数的运算2.1 并、差、交2.2 投影、选择2.3 笛卡尔积2.4 连接2.5 重命名2.6 优先级 一、关系代数的概念 关系代数是一种抽象的数据查询语言用对关系的运算来表达查询 运算对象:关系运算符:4类运算结果:…

ubuntu20 安装python2

1. 确保启用了 Universe 仓库 在某些情况下,python2-minimal 包可能位于 Universe 仓库中。你可以通过以下命令启用 Universe 仓库并更新软件包列表: bash复制 sudo add-apt-repository universe sudo apt update 然后尝试安装: bash复制…

MySQL无法连接到本地localhost的解决办法2024.11.8

问题描述:我的MySQL可以远程连接服务器,但无法连接自己的localhost。 错误提示: 2003 - Cant connet to MySQL server on localhost(10061 "Unknown error")查找问题原因: 1. 检查环境变量是否正确:发现没…

最新Spring Security实战教程(一)初识Spring Security安全框架

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…

告别GitHub连不上!一分钟快速访问方案

一、当GitHub抽风时,你是否也这样崩溃过? 😡 npm install卡在node-sass半小时不动😭 git clone到90%突然fatal: early EOF🤬 改了半天hosts文件,第二天又失效了... 根本原因:传统代理需要复杂…

Leetcode 1477. 找两个和为目标值且不重叠的子数组 前缀和+DP

原题链接&#xff1a; Leetcode 1477. 找两个和为目标值且不重叠的子数组 class Solution { public:int minSumOfLengths(vector<int>& arr, int target) {int narr.size();int sum0;int maxnINT_MAX;vector<int> dp(n,maxn);//dp[i]表示以索引i之前的满足要求…

R语言绘图:韦恩图

韦恩分析 韦恩分析&#xff08;Venn Analysis&#xff09;常用于可视化不同数据集之间的交集和并集。维恩图&#xff08;Venn diagram&#xff09;&#xff0c;也叫文氏图、温氏图、韦恩图、范氏图&#xff0c;用于显示元素集合重叠区域的关系型图表&#xff0c;通过图形与图形…

智谱AI-FunctionCall

智谱AI-FunctionCall 编写FuncationCall大模型的函数调用&#xff0c;先直观的感受一下的感受下FunctionCall的魅力 文章目录 智谱AI-FunctionCall[toc]1-参考网址2-思路整理3-代码拆件1-[非核心]两个业务函数2-[非核心]业务函数的JsonSchema定义3-[核心]FunctionCall的调用1-打…

android亮灭屏流程分析

前言 亮灭涉及的东西非常多&#xff0c;因此单独写一个文档&#xff0c;进行详细说明&#xff0c;亮灭屏包括的东西不只是亮灭屏&#xff0c;还包括亮度调节、屏幕状态变化等东西。本文仅作学习使用&#xff0c;不涉及商业&#xff0c;侵权请联系删除。 framework层的学习链接…

Docker Desktop常见问题记录

1.docker pull报错&#xff0c;无法连接https://registry-1.docker.io/v2/ 报错信息如下&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection(Client.Timeout exceeded …

vscode+vue前端开发环境配置

目录 一、安装Vue二、使用vue新建项目 一、安装Vue 在node.js安装好之后&#xff0c; npm config set registry https://registry.npmmirror.com# 安装vue相关工具&#xff0c;webpack用来项目构建、打包、资源整合等。 npm install webpack -g# 安装vue-cli脚手架 npm insta…

Hive-08之数据仓库之建模、分析

一、目标 掌握数据仓库基本概念熟悉数据仓库的模型建立 二、知识要点 1. 数据仓库基本介绍 英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供决策支持&#xff08;Decision Support&#xff09;…

仿12306项目(4)

基本预定车票功能的开发 对于乘客购票来说&#xff0c;需要有每一个车次的余票信息&#xff0c;展示给乘客&#xff0c;供乘客选择&#xff0c;因此首个功能是余票的初始化&#xff0c;之后是余票查询&#xff0c;这两个都是控台端。对于会员端的购票&#xff0c;需要有余票查询…

MySQL零基础教程16—表连接进阶

复习表别名 之前已经学习过&#xff0c;查询的时候可以使用as来对检索的列进行重命名&#xff0c;这样可以让sql更加简介&#xff0c;增强易读性&#xff08;as可以省略&#xff09; 此外&#xff0c;使用表别名还可以支持在一条select语句中&#xff0c;一个表是被多次使用 …

【JavaSE-3】运算符

1、什么是运算符 就是对常量或者变量进行操作的符号&#xff0c;如&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/ 表达式&#xff1a; 用运算符把常量或者变量连接起来的&#xff0c;符合java语法的式子就是表达式。 2、 算术运算符 2.1、基本四则运算符 - * / % 都…

直接法估计相机位姿

引入 在前面的文章&#xff1a;运动跟踪——Lucas-Kanade光流中&#xff0c;我们了解到特征点法存在一些缺陷&#xff0c;并且用光流法追踪像素点的运动来替代特征点法进行特征点匹配的过程来解决这些缺陷。而这篇文章要介绍的直接法则是通过计算特征点在下一时刻图像中的位置…

VS2022C#windows窗体应用程序调用DeepSeek API

目录 一、创建DeepSeek API Key 二、创建窗体应用程序 三、设计窗体 1、控件拖放布局‌‌ 2、主窗体【Form1】设计 3、多行文本框【tbContent】 4、提交按钮【btnSubmit】 5、单行文字框 四、撰写程序 五、完整代码 六、运行效果 七、其它 一、创建DeepSeek API Ke…

kettle插件-高性能插入更新插件Upsert

场景&#xff1a;假如T日需要将a表中T-1日的数据同步到b表。由于某种业务需求a表中已经同步到b表中的数据发生了变化需要重新同步&#xff0c;这个时候就会用到插入更新插件&#xff0c;也就是 说a表中数据重新同步b表&#xff0c;若b表中存在此数据&#xff08;根据唯一id&am…