我们正在开发一款新手游,里面有道具,之前也写了一篇博文记录了下我们的设计思路,但是国庆到了,于是我有了时间继续纠结这个问题。

其实我主要是在到底是用mysql还是mongodb上纠结。这个复杂、痛苦、找虐的挣扎过程就不说了,最终我选择了mysql(可能我还是比较保守吧, ^-^)。

现在将我们最终方案记录下来备忘。

一、道具buff存储、使用

  1. 所有buff都以如下类似键值对的方式拼接成字符串后存于mysql数据库:

    atk+30;def-20;hp+30

  2. 某条原始道具数据会在redis里缓存(具体见下文)
  3. 属性分拆缓存:将buff数据解析成为map后在redis里以hashmap 形式再存一份,键名为itemid-buff
  4. 最终buff消费者都是从redis里读取:
    • 后台需要buff进行计算的,如战斗、装备升级等,直接读取 属性分拆缓存
    • 不需要对具体属性值进行处理的,如直接发送到前端的,如存入数据库,读取原始属性(buff字符串)
  5. 在运营中可能需要对属性进行一些分析、查询,而现有的方案buff都是以字符串形式存储,用 like '%***%' 查询,从性能上显然是不允许的。于是我们想到了一个“空间换时间”的方法——对常用的buff值进行单独建表索引,如:

    atk+30;def-20;hp+30

    create table index-goods-buff-atk (good-id bigint,val int , primary key (good-id,val), index (val))

    create table index-goods-buff-def (good-id bigint,val int , primary key (good-id,val), index (val))

    create table index-goods-buff-hp (good-id bigint,val int , primary key (good-id,val), index (val))

*在增加、修改相关属性时,增加、修改属性索引表数据

二、道具数据处理流程

所有数据访问都封装在model层。

  1. 在程序的model层里定义公共函数GetDb(playerid,areaid),用于物品数据及其它需要进行按用户水平分割的数据获取数据库(连接)
  2. 每一个物品的主键id 由 函数根据自定义规则(这个修改了v1.0里的方式) 生成,确保表内唯一
  3. 将装备buff及某道具特有属性统一以键值对字符串形式保存在一个varchar字段里
  4. 道具表定义 失效时间 字段,这个字段同时表示道具有效期的三种情况:
    • =0 ,表示是不限时的永久性道具
    • 小于等于600000,表示有效时间段,如双倍经验卡有效时长3小时,那么着个字段值为 180 (分钟),使用此道具时,用当前时间加上这个字段值得到失效时间戳修改此字段或做其他处理
    • 大于600000,表示该道具的失效时间戳(unix时间戳格式)
  5. 玩家道具数据查询流程:

    • 首先检查redis里有没有
    • 如果有,返回
    • 如果没有从数据库里查询
    • 调用 属性分拆缓存 , 并存到redis
    • 返回
  6. 修改/或增加道具数据流程:

    • 首先检查redis里有没有
    • 如果没有,从数据库里查询并存到redis
    • 如果有,继续
    • 修改/增加redis数据,如果buff字段有修改,则调用 属性分拆缓存 处理
    • 同时在key为“item-update-list”的redis list 数据里记录下该道具的主键
    • 定时根据“item-update-List”数据写回mysql,并清除“item-update-list”
  7. 删除一个道具数据流程:

    • 在redis 里key为“item-delete-list” 的redis list 数据里记录下该道具的主键
    • 删除redis里记录
    • 删除 属性分拆缓存
    • 定时根据item-delete-list”数据删除mysql里记录,并清除“item-delete-list”
  8. 注意:

    • 配置redis 为 在每次更新操作后进行日志记录
    • 缓存定时同步mysql处理程序可以作为一个独立的进程运行
    • 这个解决方案可以针对其它用户私有数据,如技能、buff。

//
//每次开发一款新的游戏都是一个新的开始、新的征程、新的挑战,我们一直在路上!
//创新手机游戏《3L》开发点滴
//

创新手机游戏《3L》开发点滴(3)——道具、物品、装备表设计 V2(最终版)的更多相关文章

  1. 创新手机游戏《3L》开发点滴(1)——道具、物品、装备表设计

    一.游戏物品/道具系统数据模型设计特点 为了让游戏更加的丰富,我们1201团队的新手机游戏设计了道具系统.于是丰富了游戏.取悦了玩家,哭了开发——道具/物品数据子系统是简单的.复杂的.不确定的: 简单 ...

  2. HBase概念学习(八)开发一个类twitter系统之表设计

    这边文章先将可能的需求分析一下,设计出HBase表,下一步再開始编写client代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,參考HBase实战这本书实际动手做了这个样例. ...

  3. Android——Cocosd2d-x手机游戏开发学习思路

    手机APP应用如雨后春笋般冒了出来,而在众多的APP应用中,游戏占据了半壁江山.它丰富着人们的业余生活,增进了人们之间的沟通交流.也有许多开发的朋友对游戏开发情有独钟,他们不止是享受着有很多的人们去下 ...

  4. android手机游戏开发Cocos2d-x开发分享

    我想现在应该没有人没有玩过手机游戏了吧,当然所有人都玩过,但不是所有人都知道怎么去开发手机游戏,因为许多人都感觉做开发是一件很困难的事儿,身边的朋友也对此感觉难度很大.但是,现在我可以告诉你,手机游戏 ...

  5. 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?

    如题! 首先说一说学习手机游戏(移动游戏)这件事. 眼下移动互联网行业的在以井喷状态发展.全球几十亿人都持有智能终端设备(ios android),造就了非常多移动互联网创业机会: 一.移动社交 微信 ...

  6. 斗牛app上架应用宝、牛牛手机游戏推广、百人牛牛app应用开发、棋牌游戏上传、手游APP优化

    联系QQ:305-710439斗牛app上架应用宝.牛牛手机游戏推广.百人牛牛app应用开发.棋牌游戏上传.手游APP优化 iOS开发iPhone/iPad平台安卓手机软件开发机型覆盖范围 超过113 ...

  7. Android安卓手机游戏开发

    成都传智播客Java培训,免费学Android安卓手机游戏开发,安卓android开发课程包括Android安卓应用开发和Android安卓游戏开发两个方向,可是偏向游戏开发. 依据"199 ...

  8. 手机游戏运营主要的指标是什么? 7天活跃, 14天活跃 ARPU ?如何提升游戏 app 的虚拟道具的收入?

    数据采集越细,手段越丰富,所获得的数据也就更加详实,虽然手机游戏没有网游那么复杂,但也需要数据化运营,而且是必要的,是优化游戏收入的关键,大家最主要关心的是下面三类数据的指标 1. 用户数量首先,在移 ...

  9. Unity3D手机游戏开发

    <Unity3D手机游戏开发> 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 ...

随机推荐

  1. js中数组的api整理

    首先列出所有的方法: join(), sort(), slice(), splice(), concat(), reverse(), push()+pop(), shift()+unshift(), ...

  2. 【HDOJ 2888】Check Corners(裸二维RMQ)

    Problem Description Paul draw a big m*n matrix A last month, whose entries Ai,j are all integer numb ...

  3. eclipse中误删tomcat后,文件都报错,恢复server时无法选择tomcat7.0解决办法

    创建Tomcat v7.0 Server 不能进行下一步. 解决方法: 1.退出 eclipse 2.到[工程目录下]/.metadata/.plugins/org.eclipse.core.runt ...

  4. mariadb或者mysql忘记root密码

    windows======================net stop mysql #先停止mysql或者在服务管理里面停止 直接打开Windows的命令行(CMD)窗口(以管理员身份运行),输入 ...

  5. 03JavaScript 输出

    JavaScript 输出 JavaScript 没有任何打印或者输出的函数. 先来一点DOM的小知识点: DOM 解释: 您会经常看到 document.getElementById("i ...

  6. Java中connection的常用方法及其描述是什么

    1. close(), 关闭该数据库连接2. commit(), 提交所有更改内容并释放该Connection对象锁定的资源3. createStatement(), 基于本Connection对象, ...

  7. Tornado异步与延迟任务

    最近一直在研究Tornado异步操作,然而一番研究后发现要使一个函数异步化的最好方法就是采用相关异步库,但目前很多功能强大的库都不在此列.经过一番查找文档和搜索示范,终于发现了ThreadPoolEx ...

  8. Postgresql 入门笔记

    引言     最近整理了一些PostgreSQL的 常用命令,仅供参考   1. 入门命令 # 重启数据库 $ service postgresql-9.5 restart # 登陆: $ psql ...

  9. Java : Netty 入门案例

    接收端代码: public class IOServer { public static void main(String[] args) throws IOException, Interrupte ...

  10. windows下nginx的安装

    一. 下载 http://nginx.org/    (下载后解压) 二. 修改配置文件 nginx配置文件在 nginx-1.8.0\conf\nginx.conf http { gzip on; ...