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

其实我主要是在到底是用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. 【Django笔记一】windows系统下搭建Django项目

    一.环境版本信息: 操作系统:windows10 Django版本:2.0.5 Python版本:3.6.4 二.创建虚拟环境: 1.为什么要创建虚拟环境: 我们要开发一个新的项目,需要一套独立的Py ...

  2. C++ 内存、new与malloc分配内存区别?

    一关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)在栈上创建. ...

  3. CF考古活动

    Codeforces Beta Round #1 http://codeforces.com/contest/1 A.测试用水题,呵呵.给三个数nma,求ceil(n/a)*ceil(m/a). 长整 ...

  4. 分析nginx 日志常用命令

    一.概念 并发连接数    客户端向服务器发起请求,并建立了TCP连接.每秒钟服务器链接的总TCP数量,就是并发连接数.请求数    请求数指的是客户端在建立完连接后,向http服务发出GET/POS ...

  5. CSS翻转小效果

    CSS3翻转显示另外一张图: 1.backface-visibility:hidden;背面不可见 2.transform:rotate();旋转 (可以把图片换成本地图片看一下效果) <!DO ...

  6. 用 wait-notify 解决生产者-消费者问题

    //生产者 package com.mzj.test; import java.util.Vector; import java.util.logging.Level; import java.uti ...

  7. SQL盲注

    一.首先输入1和-1 查看输入正确和不正确两种情况 二.三种注入POC LOW等级 ... where user_id =$id 输入      真  and  假 = 假 (1)...where u ...

  8. LeetCode初级算法的Python实现--动态规划

    动态规划的本质是递归:所以做题之前一定要会递归:递归式就是状态转移方程:这里将会介绍使用动态规划做题的思维方式. 统一的做题步骤: 1.用递归的方式写出代码:(此方法写的代码在leetcode中一定会 ...

  9. Solr第二讲——SolrJ客户端的使用与案例

    一.Solrj的使用 1.什么是Solrj solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过Sol ...

  10. 北京Uber优步司机奖励政策(3月8日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...