Evt数据模型
[TOC]
数据模型简介
针对不同的业务需求,事件积分系统(EVT)中抽象出了不同的数据模型,这些数据模型能够分别代表EVT常用的不同数据支持能力。
| modeltype | 数量 | TKNOSService中的类名 | 积分模型 | |
|---|---|---|---|---|
| 1 | normal | 4689 | CNormalModel | 普通模式、赛季模式、衰减模式 |
| 2 | cycle | 3918 | CCycleModel | 自然周期模式 |
| 3 | active | 2650 | CActiveModel | 活动模式 |
| 4 | keyint | 653 | CKeyIntModel | 全局统计模式 |
| 5 | manage | 124 | CManageModel | 专家管理模式 |
| 6 | timeserise | 47 | CTimeSerise | 活跃度模式 |
| 7 | multiquery | 44 | CMultiQueryModel | 多值查询模式 |
| 8 | recentwinrate | 29 | CRecWinRateModel | 近N场胜率模式 |
| 9 | simplewinrate | 26 | CWinRateModel | 简单胜率模式 |
| 10 | fusecom | 21 | CFuseCompute | 组合计算模式 |
| 11 | average | 20 | CAverageModel | 均值模式 |
| 12 | recentresultex | 19 | CRecentResultEx | 近N场结果模式 |
| 13 | autoinc | 4 | CAutoIncModel | 体力值模式 |
| 14 | orderobject | 2 | COrderedObjectModel | |
| 15 | formattag | 1 | CFormateTagModel | |
| 16 | tagview | 105 | 视图模式 |
normal
NOS中最常使用的数据类型,很多运维是用的积分模型都依赖于此。
1. 数据结构
normal 类型是最一开始的类型,由于历史原因,其本身包含多种业务场景。
Hash 类型,一个 key 会存储多个 field-value。
数据结构:
- 若未配置【数据周期切换长度】,即
lifecycle_period==1:- HashKey:
[namespace]:[pid],例如YLNL:123456789。 - HashField:
- 区分mpid:
[eid]_[mpid]_[defField],例如60888003_995_ct - 不区分mpid:
[eid]_[defField],例如60647358_ct
- 区分mpid:
- HashKey:
- 若配置了【数据周期切换长度】,即
lifecycle_period!=1:- HashKey:
[namespace]:P[pid]S*<YYYYMMDD>N<period>,例如XSJ:P123456789SM202508N3。 - HashField:
- 区分mpid:
[eid]_[mpid]_[defField],例如60888003_995_ct - 不区分mpid:
[eid]_[defField],例如60127013_ct
- 区分mpid:
- HashKey:
2. 应用
2.1 普通模式
(1)简介
普通模式是最常用的模式,可实时记录用户个人数据并永久保留,不会随时间等因素自行改变。
主要用于记录用户可永久使用的个人数据。例如,用户累计完成猎杀电鳗鱼的数量、用 户在夺金赛中所得分数、用户参与抽奖的标记等。
(2)案例:千炮捕鱼累计捕获美人鱼数量
千炮捕鱼业务的成就体系中,玩家通过完成一系列的任务,达成相应的成就,并获得相应奖励。
依据上述需求,需记录玩家累计捕获美人鱼的数量,当捕获数量达到一定数值时,触发相应成就奖励。
2.2 赛季模式
(1)简介
赛季模式即在每一个定义周期(非自然周期)结束后,将数据进行重置。
例如:设置一个初始值为 1 的 15 日积分,该积分会在每个周期(15 日)最后一天的 24:00,将积分重置为 1。
主要用于记录各类非自然周期性的个人数据。例如,每五天玩家参与A比赛的次数、每三个月(一个赛季)玩家的段位分等。
(2)案例:页游活动奖励领取次数
页游活动以每 2 个月为一个赛季周期,赛季期间玩家通过签到、比赛、完成任务等方式获得相应的奖励。每个赛季结束时,需统计玩家在本赛季中领取奖励的次数,相关次数可以用于玩家成就展示等。
新赛季开始后,玩家奖励领取次数清零、重新累积。
依据上述需求,需记录玩家活动奖励领取次数,赛季开始时间 2017 年 12 月。
2.3 衰减模式
(1)简介
衰减模式中积分值会随时间(每秒)的减少而递减(减1),直至为0。此模式可提供有效剩余秒数和到期时间查询等。
主要用于各类具有倒计时、有效期等需求的应用并实时提供道具状态、有效期和剩余时间等。
(2)案例:萌球大战老虎怪兽形象
萌球大战中需要为玩家提供一批特色怪兽形象,玩家可以通过充值、秋卡兑换等形式购买/兑换相应形象。特色形象存在有效期,到期自动失效,并为玩家提供形象的剩余使用时间的查询。 根据以上需求,需要记录用户持有老虎怪兽形象的剩余时间。
2.4 签到模式(非自然周期签到)
(1)简介
该类签到的周期是以签到次数的维度进行划分,支持累计签到和连续签到。周期可依据业务需求进行设置,不支持补签。
- 累计签到:当累计签到次数达到 N 次时重置签到数据,中途允许签到中断;
- 连续签到:当连续签到次数达到 N 次时重置签到数据,中途不允许签到中断;如提前中断,数据将重置。
例如,累计签到 10 次为一个签到周期,在签到满第 10 次后,签到数据会进行重置。
另外,签到机制不仅限于点击/自动触发,还可以结合比赛或其他条件形成组合式奖励方案。例如:用户每天完成一局斗地主比赛,比赛结束后领取奖励;若连续 5 天完成任务,则发放额外奖励,发放奖励后可继续累积或重新累积。
(2)案例:海外 3D 千炮捕鱼连续签到天数
海外 3D 千炮捕鱼中玩家签到规则为:记录玩家连续签到天数,根据玩家不同的连续签到次数发放相应的奖励。玩家连续签到 5 天奖励 200 金币、连续签到 15天奖励 2000 金币。当连续签到超过 15 天,重新开始累积。连续签到中断,次数将重置,重新开始签到。
(3)案例:飞行棋用户累计签到
飞行棋游戏中玩家签到规则为:记录累计用户签到次数,根据不同的签到次数发放相应的奖励。用户累积完成 1 天签到奖励 5 金币、完成 2 天签到奖励 10 金币等,累积签到 7 天,重置签到数。
cycle
1. 数据结构
Hash 类型,一个 key 会存储多个 field-value。
数据结构:
- HashKey:
[namespace]:P[pid]T[YYYYMMDD],例如ZH:P123456789T20250911。 - HashField:
- 区分mpid:
[eid]_[mpid]_[defField],例如63154704_995_ct - 不区分mpid:
[eid]_[defField],例如63154704_ct
- 区分mpid:
2. 应用
2.1 自然周期模式
(1)简介
自然周期模式即在每一个定义的自然周期结束后,数据会重置(自然周期包括:日、周、月、年),即有日积分、周积分、月积分、年积分,重置时间可依据需求自行设定。
例如:以初始值(事件积分系统发行时设定的值)为 1,重置时间为 05:45 的周积分为例,该积分值会在每周一的 05:45 变成 1。
主要用于记录个人的自然周期性数据。例如,用户每天的经验值增长、每周的金币增长等。
(2)案例:俄罗斯方块经典模式每周最好成绩
在俄罗斯方块游戏的各个游戏模式中记录玩家每周内的最好成绩,用于展示、发奖等需要。
要求每周结束后将用户最好成绩清零,并重新记录玩家第 2 周的最好成绩。
2.2 签到模式(自然周期签到)
(1)简介
该类签到的周期是以自然时间维度进行划分,仅支持按自然周和自然月进行签到。签到数据会在下一个自然周期的 00:00 点进行重置,并支持补签。
以自然周签到为例,在第一周内任意一天进行的签到,无论次数签满 7 次与否,在第二周周一的 00:00 点,签到数据均会进行重置。
另外,签到模式(自然周期)适用于统计用户每周或每月等的签到情况。可以查询用户在当前周期内连续签到天数、总签到天数、当天是否签到、可补签次数、用户总签到情况等。
(2)案例:JJ 捕鱼每周累计签到
JJ 捕鱼中玩家签到规则为:记录玩家一周内每天的签到情况,依据一周中不同的签到累计次数发放相应的奖励。一周结束后签到次数重置,重新开始签到。
active
1. 数据结构
kv 类型,也就是一个 key 只存储了一个 string 的 value,key 形如:XPT3:P[0-9]*[0-9]E61378440
会设置一个过期时间,通过 ExpireAt 指定过期时间对 key 进行过期。
2. 应用
2.1 活动模式
(1)简介
活动模式均有一个有效期和数据的清除时间,该数据在达到设定好的清除时间时,会在短时间内被迅速清理。
主要用于记录一段时间内(非周期性)的个人数据。大量用于各类短期活动,或非固定周期重复的活动。例如,春季大米活动兑换次数标记、元宵节期间玩家累计金币数量等。
(2)案例:千炮活动币
千炮捕鱼增加抽奖活动,用于吸引玩家、提升游戏可玩性。玩家消耗一定量的千炮捕鱼活动币进行抽奖,获得相应的奖励。
千炮捕鱼抽奖活动会不定期开始,需要记录玩家在千炮捕鱼活动期间拥有的活动币数量,每次活动结束后数据清零,下次活动开始后重新记录玩家活动币个数,可以复用该积分。
keyint
1. 数据结构
- 区分 mpid 时,该模型为 hash 结构:
- 是周期积分,即 lifecycle_unit 有值时:
- HashKey:
[namespace]:E[eid]T[YYYYMMDD],例如:AITJ:60004020T20250911 - HashField:
[mpid],例如:[995]
- HashKey:
- 是普通积分,即 lifecycle_unit 没有值时:
- HashKey:
[namespace]:[eid],例如:YLNL:60777002 - HashField:
[mpid],例如:[995]
- HashKey:
- 是周期积分,即 lifecycle_unit 有值时:
- 不区分 mpid 时,该模型为 key-value 结构:
- 是周期积分,即 lifecycle_unit 有值时:
- key:
[namespace]:E[eid]T[YYYYMMDD],例如:ZH:E61186712T20250911
- key:
- 是普通积分,即 lifecycle_unit 没有值时:
- key:
[namespace]:E[eid],例如:ZH:E60033014
- key:
- 是周期积分,即 lifecycle_unit 有值时:
2. 应用
2.1 全局统计模式
(1)简介
全局统计模式记录全量数据,一般以产品、活动维度进行实时数据统计。
主要用于记录、统计全平台的全量数据,不同于之前提到的个人数据。例如,统计大米活动中实时统计兑换大米的人数、斗地主节完成任务的人数等。
另外,全局统计模式可以与自然周期模式或赛季模式组合使用,实现对全局数据的周期性报告。
(2)案例:2017 年报已开启人数
2017 年末推出的 JJ 年报活动,需记录全平台已开启 2017JJ 年报的人数,作为评估年报活动的影响力。
manage
此数据类型是远古类型,等同于 cycle 类型。
现在已不再使用,这里不再详细介绍。
1. 数据结构
hash 类型。
2. 应用
2.1 专家管理模式
该模式只用于后台人员维护使用。
timeserise
1. 配置字段
lifecycle_unit:查询单位,目前支持“日”、“月”,默认为“日”queryrange:查询时间长度。例如 n 天、n 个月storerange:存储时长,保留的 field 个数,需大于 queryrangequerymethod:查询方式,目前支持 count、average、max、min 四种类型,默认为 count
2.数据结构
- key:
[namespace]:P[pid]E[eid],例如:WXD:P793164281E61488562 - field:当 lifecycle_unit 为 “日” 时,field 形如
20250516、20250519
3. 应用
3.1 活跃度模式【最近N(单位)事件】
(1)简介
活跃度模式是以日为最小单元,统计个人最近N天内每天的活跃度指标数据(包括但不限于经验、金币、充值额)。
主要用于实时统计个人近期的活跃度。可计算各项活跃度指标的累积值、平均值、最值。
另外,用户活跃度模式可根据不同的业务需求,实时计算玩家最近 1~N 天的各项活跃度指标的累计值、平均值、最值,同时保证一次统计,多维度使用。例如:用户可以查询最近 7 天的最高日活跃或者最近 10 天的平均活跃。
(2)案例:用户活跃度积分
玩家实时活跃度(例如,近 60 天经验累积值、近 30 天日均经验值、近 180天单日最大充值额)可作为一项重要运营数据,如作为各类活动的准入门槛(防刷)、各类任务成就的领取/达成条件、排行榜的数据依据等。
multiquery
此积分类型是远古类型,效果等同于 normal 类型的积分打开 “区分mpid” 的开关。
此类型不再使用,这里不再详细介绍。
1. 数据结构
2. 应用
2.1 多值查询模式
(1)简介
多值查询模式可支持同一积分对不同比赛/游戏的同类数据进行查询、修改。
主要用于记录用户各个比赛层级的成绩/成就/获得奖励等个人数据。例如,使用一个积分,统计玩家在斗地主、麻将、德州比赛中获得的金币数量。
(2)案例:用户各个比赛打入决赛桌的次数
需记录用户在各个比赛中打入决赛桌的次数、获得冠军的次数等,可用于统计用户各个比赛维度下的比赛成绩。
recentwinrate
该类型近三年内都未被使用,可通过其它方式实现类似的效果。
1. 数据结构
hash 类型。
- HashKey:
[namespace]:[eid],例如:HD:123456789 - HashField:
[eid]_allround,例如:60046031_allround
2. 应用
2.1 近N场胜率模式
(1)简介
近N场胜率模式主要是计算用户个人维度最近N次的比赛胜负情况。
主要用于记录用户的近N场胜负情况,如最近N场的胜率、胜场等。
(2)案例:军旗最近 100 场胜率
军棋游戏为运营等活动需求,需要记录玩家在近 100 场次比赛中的胜率,以此为基础,为游戏其它运营提供支持。
simplewinrate
远古积分类型,当前可通过 esp + 积分实现同样的效果。此处不再介绍。
1. 数据结构
2. 应用
2.1 简单胜率模式
(1)简介
简单胜率模式是记录用户个人维度的周期、时间段和终身胜率相关数据。
主要用于记录玩家的胜负情况(个人数据),可实时计算个人历史胜率,同时支持查询个人的胜场数和负场数。
另外,简单胜率模式可以结合赛季模式使用,统计用户在某一周期内的获胜情况。同时,该模式还适用于统计用户某项行为所占的比重,例如用户在保皇比赛中选择放弃“皇位”的比例、用户抽奖活动中的中奖率等。
(2)案例:河北麻将用户胜率
河北麻将游戏为丰富比赛玩法,根据玩家胜率匹配对手,提升游戏的可玩度。
依据上述需求,需要记录玩家参加河北麻将所有比赛的历史胜率,统计用户在河北麻将中获胜的比例,可用于游戏过程中对实力相近的对手进行匹配,提高用户体验。
fusecom
没有积分实体,通过特定方式实现查询效果。
查询方式以 json 格式记录于 fuserule 列。
1. 数据结构
没有存储实体。
2. 应用
2.1 组合计算模式
(1)案例:
-
积分:60777004,盈利能力标签-近50副牌的输赢分-查询(fusecom)
-
功能:当玩家游戏场次没有超过 10 场且玩家当前输赢分超过阈值时,返回阈值;其他情况返回真实输赢分。相当于为玩家新增了 “新手保护期” 。
-
fuserule 规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
{ "argc": [ { "id": 60777001, "name": "changci", "param": 1, "type": "grow" }, { "id": 60777002, "name": "yuzhi", "param": 1, "type": "grow" }, { "id": 60777000, "name": "shuyingfen", "param": 1, "type": "grow" } ], "rule": "result=shuyingfen-yuzhi", "segment": [ { "case": "result>0&changci<10", "returnparam": "yuzhi", "title": 1 }, { "returnparam": "shuyingfen", "title": 2 } ] }
average
远古模型,最近5年内都未再使用,本文不在详细介绍。
功能等效于 recentresultex 模型。
1. 数据结构
2. 应用
2.1 均值模式
(1)简介
(2)案例:
recentresultex
1. 数据结构
hash 类型的,记录的数据格式如下所示:
2. 应用
2.1 近N场结果模式
(1)简介
近N场结果模式主要是计算用户个人维度最近N次的比赛结果情况。
主要用于记录用户的近N场结果情况,如最近N场的赢得的分数、金币等。
(2)案例:(暂无,后面可以补充)
autoinc
1. 数据结构
hash 类型。
- HashKey:
[namespace]:[userid],例如:CJ:123456789 - HashField:有两个,用于完成计算:
- 剩余体力值:
[eid]_[defField],例如:60015005_ct - 过期时间戳:
[eid]_its,例如:60015005_its
- 剩余体力值:
2. 应用
2.1 体力值模式
(1)简介
体力值模式具备周期性数据自增的特性,拥有一定上限值。体力值可随时间的增长而规律增长,直至达到最大体力值。
主要用于体力值的记录及类似体力值恢复型道具的记录。提供连续增长和非连续增长两种模式。
(2)案例:象棋游戏增添锦囊道具
锦囊道具可为玩家提供多样玩法,如游戏中每 6 小时恢复一个锦囊,可以使用或购买锦囊。锦囊可自动恢复,最多为 10 个。 依据上述需求,需要记录象棋玩家比赛中的锦囊个数。
tagview
tagview 是积分域的类型,往后的所有积分域都用此类型。
1. 数据结构
略
2. 应用
2.1 视图模式
(1)简介
视图模式提供可变的读写方式,实现对同一积分采用不同类型操作/查询方式。
主要用于多元化复杂场景中,通过对同一积分提供多种访问形式,支持对数据的多样化修改和查询。
(2)案例:象棋比赛结果连胜次数
象棋比赛玩家成就展示需要记录玩家比赛连胜次数,当比赛胜利后,需累计玩家胜利次数;当比赛失败后,玩家连胜次数需要重置为 0。
该模式可对连胜次数提供 2 种修改方式:
- 记录累计连胜次数;
- 重置累计连胜次数。
(3)案例:千炮捕鱼极寒之刃
当用户通过购买/兑换等方式,获得具有有效期的千炮捕鱼道具(极寒之刃)时,需确定该道具是否可用、何时失效等。
依据上述需求,该模式为千炮捕鱼极寒之刃道具提供了 2 种查询方式:
- 查询道具将在几秒后过期,若剩余时间为 0,则表示该道具已过期;
- 查询道具的失效日期,可精确到秒。
(4)案例:军棋每日签到
军棋每日签到中玩家签到规则为:需要记录玩家累计签到次数,根据玩家不同的累计签到次数发放相应的奖励,且签到次数达到一定数值时将累计签到次数重置。
该模式对每日签提供 2 种修改方式、2 种查询方式:
- 修改
- 修改玩家累计签到次数;
- 重置玩家累计签到次数。
- 查询
- 查询玩家累计签到次数;
- 查询签到的时间,可精确到秒。











