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

其实我主要是在到底是用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. c和c++单链表

    c++版 #include<iostream> #include<malloc.h> using namespace std; struct node{ int data; n ...

  2. [读书笔记] Spring MVC 学习指南 -- 第一章

    控制反转(Inversion of Control, IoC)/ 依赖注入: 比如说,类A依赖于类B,A需要调用B的某一个方法,那么在调用之前,类A必须先获得B的一个示例引用. 通常我们可以在A中写代 ...

  3. CSS动画实例

    上一篇讲过css动画transform transition的语法,这一节展示自己做的几个小例子加深印象 1. 线条动画效果 代码:最外层div包含2个小的div : a和b.   a有左右边框(高度 ...

  4. Asp.Net Core链接Mysql数据库

    一.新建一个Asp.Net Core WebMVC程序 添加nuget包  Mysql.Data 二.新建一个UserContext类 下面代码中的UserInfo是我自己建的一个实体,里面有俩字段: ...

  5. array of TVarRec 动态数组使用

    FDQuery.AppendRecord()里是一个array of TVarRec.我们一般都是直接用[Var1,Var2,...].这样手工输入,但如果增加的元素我们预先不知道,就要声明一个arr ...

  6. Linux字符设备学习,总结

    注册字符驱动的一种老方法: 注册一个字符设备的经典方法是使用:int register_chrdev(unsigned int major, const char *name, structfile_ ...

  7. 22-Consent 确认逻辑实现

    1-定义一个从前台传到后台的viewModel namespace MvcCookieAuthSample.Models { public class InputConsentViewModel { ...

  8. Java设计模式(7)——结构型模式之适配器模式(Adapter)

    一.概述 概念 其实,举个生活中的例子的话,适配器模式可以类比转接头,比如typeC和USB的转接头,把原本只能接typeC的接口,拓展为可以接普通USB:这里的转接头一方面需要查在typeC上,一方 ...

  9. 深圳Uber优步司机奖励政策(1月4日~1月10日)

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

  10. 设置cell高度的两种方法(label高度的可变引起cell高度可变的情况)

    第一种:(iOS8以后可用) 在Xib或stroyboard中(代码也可以) 利用AutoLayout设置好label的约束(比如可以设置四个边都距离屏幕50等方式,必须四个边都要固定好). 在代码部 ...