项目数据库逻辑

项目数据库逻辑
数据库主要逻辑模块分为asynDBCenter,DBNet,DBSvr
asynDBCenter与DBNet之间通过共享内存通信(缓存进程为了防止GS崩溃导致玩家数据丢失,并且在DBNet里面可以做定时存储)
这里的共享内存有点复杂
1.发包类型的,就是跟GS与Net之间的相似带回收类型的
2.不带回收的,每个玩家独占一个小块,只有玩家独占,当服务器蹦了玩家数据可以存储数据库
3.对于道具由于玩家身上的道具数量众多,不可能有那么多内存分给,当玩家装备属性发生变化时将其放到共享内存中
而且有一个tick,过了这个tick直接归还,防止不常更新的道具长期占据共享内存
4.帮会,拍卖行也一行给他分配共享内存
共享内存GS这边创建DBNet那边读取

游戏过程中哪个属性发生变化,设置脏标记
DBNet根据脏标记发送差异更新包到DBSvr
问题:其实我们这个DBSvr没必要,我们现在是直接发差异更新包到DBSvr然后DBSvr访问数据库,其实可以再DBNet这一端直接访问mongo的api,就这个问题我问过经理
经理说其实是在DBNet这一段去访问数据库,不是在DBSvr,DBSvr不跟数据库打交道,DBSvr的作用是同步在各个服务器的表,服务器直接访问数据库,我也是醉了一地

听说类似memcached和redis缓冲东西应用到数据库不错,我问过经理,经理说在web上应用的比较多,在游戏中直接同步到共享内存中,在换从进程中进行定时存储,不用这个memcached机制
但貌似不是这样的,应该能用的上

举个例子吧
/*
设置玩家等级
*/
inline void    ShuiHu::ActorInfoEx::SetLevel(int nLevel)
{
    __COMPARE_START(m_actInfo.m_nLevel, nLevel)

    SetDBEnumAttrDirty(eCharDBAttr_Level);

    __COMPARE_END
}

void SetDBEnumAttrDirty(CharDBAttr eCharDBAttr)
{
    char cUseState = m_pActSM->GetUseStateSafe();//获取保存状态
    if (DB::GetbIsState(cUseState, SM_USE_SAVED))//数据库已保存清除上一次脏标记
    {
        m_attrFlag.ClearFlag();
    }
    m_attrFlag.SetBitFlag(eCharDBAttr);//将当前标记设置成脏比较
    UpdateActSMInfo(eCharDBAttr);//拷贝对于的数据到共享内存中
}

DBNet每次遍历所有的脏标记,如果是脏的话,拷贝数据出来拼相关BSON

bool DBNet::NormalDBModifyOpt(int nIndex)
{
    SM_Data<ShuiHu::ActorInfoEx>* pSMData = m_spSMDataActEx->GetSMData(nIndex);
    char cUseState = pSMData->GetUseStateFast();
    static ShuiHu::ActorInfoEx InfoEx;

    if (DB::GetbIsState(cUseState, SM_USE_READYSAVE)) //判断是否处于待保存状态
    {
        char cOpt = 0;
        pSMData->GetDBOptSafe(cOpt);

        size_t nCurSaveTime = pSMData->GetSaveTimeFast();
        //每个共享内存头部保存一个tick,每次循环根据tick定时保存数据库,正式根据这个tick和脏比较减少数据库压力
        if(!IsCanSaveDB(cOpt, cUseState, nCurSaveTime))
            return false;
    //...
}

在看个玩家下线
void asynDBCenter::SetActorInfoEx(guid_t actorID,const ShuiHu::ActorInfoEx& info)
{
    SMDataInfo<ShuiHu::ActorInfoEx>& smInfo = m_mapSMAct[actorID];
    smInfo.GetSMData()->CopyDataIn(&info);
    smInfo.GetSMData()->AddDBOpt(DB::eSM_DB_Update);
    smInfo.GetSMData()->AddUseState(SM_USE_READYSAVE);
    smInfo.GetSMData()->AddUseState(SM_USE_OFFLINE);
    //将玩家放到回收队列中,如果DBNet还没有将玩家数据保存并把玩家共享内存设置成已保存状态,这边回收队列中还有玩家的数据
    //玩家再次上线可以直接从共享内存中获取数据不用访问数据库
    if (!smInfo.GetbInRec())
    {
        smInfo.SetbInRec(true);
        m_spActorInfoExRecMgr->Push(&smInfo);
    }
}

DBNet那边
if(DB::GetbIsState(cOpt, DB::eSM_DB_Del) || DB::GetbIsState(cUseState, SM_USE_OFFLINE))
    pSMData->SetUseState(SM_USE_READYREC);//将内存设置成待回收状态
else
{
    pSMData->SetUseState(SM_USE_SAVED);
}

GS这边
if (DB::GetbIsState(cOpt, SM_USE_READYREC))//待回收状态
{
    pData->SetUseState(SM_USE_FREE); //设置为可利用状态
    m_pSmPoolMgr->Push(pData);//将这块内存放到可用队列中,下次还是从可用队列中分配一块出来
    m_pAsynDBCenter->DelSMData(pData);
    it = m_recycleDeq.erase(it);
}
时间: 2024-10-13 16:07:14

项目数据库逻辑的相关文章

机器学习—逻辑回归理论简介

下面是转载的内容,主要是介绍逻辑回归的理论知识,先总结一下自己看完的心得 简单来说线性回归就是直接将特征值和其对应的概率进行相乘得到一个结果,逻辑回归则是这样的结果上加上一个逻辑函数 这里选用的就是Sigmoid函数,在坐标尺度很大的情况下类似于阶跃函数 在确认特征对应的权重值也就是回归系数的时候 最常用的方法是最大似然法,EM参数估计,这个是在一阶导数能够有解的前提下 如果一阶导数无法求得解析值,那么一般选取梯度上升法,通过有限次的迭代过程,结合代价函数更新回归系数至收敛 //////////

Oracle 逻辑体系

Oracle 逻辑体系 主题 Oracle 逻辑体系 参考资料 Oracle 逻辑体系 表空间.模式.用户.段.区.块 Oracle中的数据逻辑上存储于表空间,物理上则存储于属于表空间tablespace的数据文件上(DBF文件).表空间的物理体现是一个或多个DBF文件.数据库由一个或多个被称为表空间的逻辑存储单元构成.表空间是数据库恢复的最小单元.表空间是个逻辑上的概念. 模式schema就是指一个用户下所有对象的集合:创建一个新用户,该用户下没有对象则schema不存在,如果创建一个对象,则

linux查看cpu个数,核数,逻辑cpu个数

物理CPU:物理CPU是相对于虚拟CPU而言的概念,指实际存在的处理器,就是我们可以看的见,摸得着的CPU,就是插在主板上面的. 物理核:CPU中包含的物理内核个数,比如我们通常说的双核CPU,单核CPU. 在linux系统下面的/proc/cpuinfo文件的条目中: 1.有多少个不同的physical id就有多少个物理CPU. 2.cpu cores记录了对应的物理CPU(以该条目中的physical id标识)有多少个物理核,现在我们个人使用的单机PC大部分使用的都是双核CPU. 逻辑C

LINUX在逻辑卷基础加盘操作步骤

扩容之前的磁盘状况 [[email protected] ~]# df -h 文件系统             容量 已用 可用已用%%挂载点 /dev/mapper/VolGroup-lv_root 5.3G  2.5G  2.6G  50% / tmpfs                 538M     0  538M   0% /dev/shm /dev/sda1             485M   30M  430M   7% /boot [[email protected] ~]#

Linux高可用集群方案之heartbeat基础原理及逻辑架构

 这篇文章我们主要学习heartbeat高可用集群的基础原理及逻辑架构,以及heartbeat的简单配置  ll  本文导航    · heartbeat之基本原理   · heartbeat之集群组件   · heartbeat之心跳连接   · heartbeat之脑裂(资源争用.资源隔离) · heartbeat之配置文件   · heartbeat至高可用集群配置  ll  要求  掌握heartbeat高可用集群的相关组件及简单配置   heartbeat之基本原理  heartbea

linux操作逻辑分区与交换分区

作业一: 1)   开启Linux系统前添加一块大小为15G的SCSI硬盘 2)   开启系统,右击桌面,打开终端 3)   为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区,大小为5G 4)   格式化主分区为ext3系统 [[email protected] 桌面]# mkfs.ext3 /dev/sdc1 5)   将逻辑分区设置为交换分区 [[email protected] 桌面]# mkswap /dev/sdc5 6)   启用上一步的交换分

从另一个视角看待逻辑回归

摘要 逻辑回归是用在分类问题中,而分类为题有存在两个比较大的方向:分类的结果用数值表是,比如1和0(逻辑回归采用的是这种),或者-1和1(svm采用的),还有一种是以概率的形式来反应,通过概率来说明此样本要一个类的程度即概率.同时分类问题通过适用的场合可以分为:离散和连续,其中决策树分类,贝叶斯分类都是适用离散场景,但是连续场景也可以处理,只是处理起来比较麻烦,而逻辑回归就是用在连续特征空间中的,并把特征空间中的超平面的求解转化为概率进行求解,然后通过概率的形式来找给出分类信息,最后设置一个阈值

RHCE7.0答案之调整逻辑卷

调整逻辑卷配置: 扩展vg, 2.扩展lv, 3.扩展文件系统 扩展文件系统时如果是ext文件系统,使用resize2fs命令,如果是xfs文件系统,则用xfs_growsfs命令 fdisk /dev/vdb, +500M, 转换为8e类型LVM pvcreate /dev/vdb2 vgextend finance /dev/vdb2 lvextend -L 810M /dev/finance/loans xfs_growfs /dev/finance/loans, 若是ext类型,则要用r

逻辑卷管理

逻辑卷管理逻辑卷创建1.fdisk t 8e //修改分区类型2.pvcreate  /dev/sd{a7,b} //创建物理卷    pvs pvdisplay   //查看物理卷信息3.vgcreate  vg0  /dev/sd{a7,b}  //创建卷组    vgs    vgdisplay4.lvcreate -n lv0 -L 15G vg0  //创建逻辑卷组    lvs    lvdisplay5.创建文件系统    mkfs.ext4 /dev/vg0/lv06.挂载