文章

Evt数据模型

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
  • 若配置了【数据周期切换长度】,即 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

2. 应用

2.1 普通模式

(1)简介

普通模式是最常用的模式,可实时记录用户个人数据并永久保留,不会随时间等因素自行改变。

主要用于记录用户可永久使用的个人数据。例如,用户累计完成猎杀电鳗鱼的数量、用 户在夺金赛中所得分数、用户参与抽奖的标记等。

(2)案例:千炮捕鱼累计捕获美人鱼数量

千炮捕鱼业务的成就体系中,玩家通过完成一系列的任务,达成相应的成就,并获得相应奖励。

依据上述需求,需记录玩家累计捕获美人鱼的数量,当捕获数量达到一定数值时,触发相应成就奖励。

image-evt-1.png

2.2 赛季模式

(1)简介

赛季模式即在每一个定义周期(非自然周期)结束后,将数据进行重置。

例如:设置一个初始值为 1 的 15 日积分,该积分会在每个周期(15 日)最后一天的 24:00,将积分重置为 1。

主要用于记录各类非自然周期性的个人数据。例如,每五天玩家参与A比赛的次数、每三个月(一个赛季)玩家的段位分等。

(2)案例:页游活动奖励领取次数

页游活动以每 2 个月为一个赛季周期,赛季期间玩家通过签到、比赛、完成任务等方式获得相应的奖励。每个赛季结束时,需统计玩家在本赛季中领取奖励的次数,相关次数可以用于玩家成就展示等。

新赛季开始后,玩家奖励领取次数清零、重新累积。

依据上述需求,需记录玩家活动奖励领取次数,赛季开始时间 2017 年 12 月。

2.3 衰减模式

(1)简介

衰减模式中积分值会随时间(每秒)的减少而递减(减1),直至为0。此模式可提供有效剩余秒数和到期时间查询等。

主要用于各类具有倒计时、有效期等需求的应用并实时提供道具状态、有效期和剩余时间等。

(2)案例:萌球大战老虎怪兽形象

萌球大战中需要为玩家提供一批特色怪兽形象,玩家可以通过充值、秋卡兑换等形式购买/兑换相应形象。特色形象存在有效期,到期自动失效,并为玩家提供形象的剩余使用时间的查询。 根据以上需求,需要记录用户持有老虎怪兽形象的剩余时间。

image-evt-4

2.4 签到模式(非自然周期签到)

(1)简介

该类签到的周期是以签到次数的维度进行划分,支持累计签到和连续签到。周期可依据业务需求进行设置,不支持补签。

  • 累计签到:当累计签到次数达到 N 次时重置签到数据,中途允许签到中断;
  • 连续签到:当连续签到次数达到 N 次时重置签到数据,中途不允许签到中断;如提前中断,数据将重置。

例如,累计签到 10 次为一个签到周期,在签到满第 10 次后,签到数据会进行重置。

另外,签到机制不仅限于点击/自动触发,还可以结合比赛或其他条件形成组合式奖励方案。例如:用户每天完成一局斗地主比赛,比赛结束后领取奖励;若连续 5 天完成任务,则发放额外奖励,发放奖励后可继续累积或重新累积。

(2)案例:海外 3D 千炮捕鱼连续签到天数

海外 3D 千炮捕鱼中玩家签到规则为:记录玩家连续签到天数,根据玩家不同的连续签到次数发放相应的奖励。玩家连续签到 5 天奖励 200 金币、连续签到 15天奖励 2000 金币。当连续签到超过 15 天,重新开始累积。连续签到中断,次数将重置,重新开始签到。

(3)案例:飞行棋用户累计签到

飞行棋游戏中玩家签到规则为:记录累计用户签到次数,根据不同的签到次数发放相应的奖励。用户累积完成 1 天签到奖励 5 金币、完成 2 天签到奖励 10 金币等,累积签到 7 天,重置签到数。

image-evt-8

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

2. 应用

2.1 自然周期模式

(1)简介

自然周期模式即在每一个定义的自然周期结束后,数据会重置(自然周期包括:日、周、月、年),即有日积分、周积分、月积分、年积分,重置时间可依据需求自行设定。

例如:以初始值(事件积分系统发行时设定的值)为 1,重置时间为 05:45 的周积分为例,该积分值会在每周一的 05:45 变成 1。

主要用于记录个人的自然周期性数据。例如,用户每天的经验值增长、每周的金币增长等。

(2)案例:俄罗斯方块经典模式每周最好成绩

在俄罗斯方块游戏的各个游戏模式中记录玩家每周内的最好成绩,用于展示、发奖等需要。

要求每周结束后将用户最好成绩清零,并重新记录玩家第 2 周的最好成绩。

image-evt-2

2.2 签到模式(自然周期签到)

(1)简介

该类签到的周期是以自然时间维度进行划分,仅支持按自然周和自然月进行签到。签到数据会在下一个自然周期的 00:00 点进行重置,并支持补签。

以自然周签到为例,在第一周内任意一天进行的签到,无论次数签满 7 次与否,在第二周周一的 00:00 点,签到数据均会进行重置。

另外,签到模式(自然周期)适用于统计用户每周或每月等的签到情况。可以查询用户在当前周期内连续签到天数、总签到天数、当天是否签到、可补签次数、用户总签到情况等。

(2)案例:JJ 捕鱼每周累计签到

JJ 捕鱼中玩家签到规则为:记录玩家一周内每天的签到情况,依据一周中不同的签到累计次数发放相应的奖励。一周结束后签到次数重置,重新开始签到。

image-evt-7

active

1. 数据结构

kv 类型,也就是一个 key 只存储了一个 string 的 value,key 形如:XPT3:P[0-9]*[0-9]E61378440

会设置一个过期时间,通过 ExpireAt 指定过期时间对 key 进行过期。

2. 应用

2.1 活动模式

(1)简介

活动模式均有一个有效期和数据的清除时间,该数据在达到设定好的清除时间时,会在短时间内被迅速清理。

主要用于记录一段时间内(非周期性)的个人数据。大量用于各类短期活动,或非固定周期重复的活动。例如,春季大米活动兑换次数标记、元宵节期间玩家累计金币数量等。

(2)案例:千炮活动币

千炮捕鱼增加抽奖活动,用于吸引玩家、提升游戏可玩性。玩家消耗一定量的千炮捕鱼活动币进行抽奖,获得相应的奖励。

千炮捕鱼抽奖活动会不定期开始,需要记录玩家在千炮捕鱼活动期间拥有的活动币数量,每次活动结束后数据清零,下次活动开始后重新记录玩家活动币个数,可以复用该积分。

image-evt-3

keyint

1. 数据结构

  • 区分 mpid 时,该模型为 hash 结构:
    • 是周期积分,即 lifecycle_unit 有值时:
      • HashKey:[namespace]:E[eid]T[YYYYMMDD],例如:AITJ:60004020T20250911
      • HashField:[mpid],例如:[995]
    • 是普通积分,即 lifecycle_unit 没有值时:
      • HashKey:[namespace]:[eid],例如:YLNL:60777002
      • HashField:[mpid],例如:[995]
  • 不区分 mpid 时,该模型为 key-value 结构:
    • 是周期积分,即 lifecycle_unit 有值时:
      • key:[namespace]:E[eid]T[YYYYMMDD],例如:ZH:E61186712T20250911
    • 是普通积分,即 lifecycle_unit 没有值时:
      • key:[namespace]:E[eid],例如:ZH:E60033014

2. 应用

2.1 全局统计模式

(1)简介

全局统计模式记录全量数据,一般以产品、活动维度进行实时数据统计。

主要用于记录、统计全平台的全量数据,不同于之前提到的个人数据。例如,统计大米活动中实时统计兑换大米的人数、斗地主节完成任务的人数等。

另外,全局统计模式可以与自然周期模式或赛季模式组合使用,实现对全局数据的周期性报告。

(2)案例:2017 年报已开启人数

2017 年末推出的 JJ 年报活动,需记录全平台已开启 2017JJ 年报的人数,作为评估年报活动的影响力。

image-evt-9

manage

此数据类型是远古类型,等同于 cycle 类型。

现在已不再使用,这里不再详细介绍。

1. 数据结构

hash 类型。

2. 应用

2.1 专家管理模式

该模式只用于后台人员维护使用。

timeserise

1. 配置字段

  • lifecycle_unit:查询单位,目前支持“日”、“月”,默认为“日”
  • queryrange:查询时间长度。例如 n 天、n 个月
  • storerange:存储时长,保留的 field 个数,需大于 queryrange
  • querymethod:查询方式,目前支持 count、average、max、min 四种类型,默认为 count

2.数据结构

  • key:[namespace]:P[pid]E[eid],例如:WXD:P793164281E61488562
  • field:当 lifecycle_unit 为 “日” 时,field 形如 2025051620250519

3. 应用

3.1 活跃度模式【最近N(单位)事件】

(1)简介

活跃度模式是以日为最小单元,统计个人最近N天内每天的活跃度指标数据(包括但不限于经验、金币、充值额)。

主要用于实时统计个人近期的活跃度。可计算各项活跃度指标的累积值、平均值、最值。

另外,用户活跃度模式可根据不同的业务需求,实时计算玩家最近 1~N 天的各项活跃度指标的累计值、平均值、最值,同时保证一次统计,多维度使用。例如:用户可以查询最近 7 天的最高日活跃或者最近 10 天的平均活跃。

(2)案例:用户活跃度积分

玩家实时活跃度(例如,近 60 天经验累积值、近 30 天日均经验值、近 180天单日最大充值额)可作为一项重要运营数据,如作为各类活动的准入门槛(防刷)、各类任务成就的领取/达成条件、排行榜的数据依据等。

multiquery

此积分类型是远古类型,效果等同于 normal 类型的积分打开 “区分mpid” 的开关。

此类型不再使用,这里不再详细介绍。

1. 数据结构

2. 应用

2.1 多值查询模式

(1)简介

多值查询模式可支持同一积分对不同比赛/游戏的同类数据进行查询、修改。

主要用于记录用户各个比赛层级的成绩/成就/获得奖励等个人数据。例如,使用一个积分,统计玩家在斗地主、麻将、德州比赛中获得的金币数量。

(2)案例:用户各个比赛打入决赛桌的次数

需记录用户在各个比赛中打入决赛桌的次数、获得冠军的次数等,可用于统计用户各个比赛维度下的比赛成绩。

image-evt-5

image-evt-6

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)案例:河北麻将用户胜率

河北麻将游戏为丰富比赛玩法,根据玩家胜率匹配对手,提升游戏的可玩度。

依据上述需求,需要记录玩家参加河北麻将所有比赛的历史胜率,统计用户在河北麻将中获胜的比例,可用于游戏过程中对实力相近的对手进行匹配,提高用户体验。

image-evt-10

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 类型的,记录的数据格式如下所示:

image-20250423154046037

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 个。 依据上述需求,需要记录象棋玩家比赛中的锦囊个数。

image-evt-13

tagview

tagview 是积分域的类型,往后的所有积分域都用此类型。

1. 数据结构

2. 应用

2.1 视图模式

(1)简介

视图模式提供可变的读写方式,实现对同一积分采用不同类型操作/查询方式。

主要用于多元化复杂场景中,通过对同一积分提供多种访问形式,支持对数据的多样化修改和查询。

(2)案例:象棋比赛结果连胜次数

象棋比赛玩家成就展示需要记录玩家比赛连胜次数,当比赛胜利后,需累计玩家胜利次数;当比赛失败后,玩家连胜次数需要重置为 0。

该模式可对连胜次数提供 2 种修改方式:

  • 记录累计连胜次数;
  • 重置累计连胜次数。
(3)案例:千炮捕鱼极寒之刃

当用户通过购买/兑换等方式,获得具有有效期的千炮捕鱼道具(极寒之刃)时,需确定该道具是否可用、何时失效等。

依据上述需求,该模式为千炮捕鱼极寒之刃道具提供了 2 种查询方式:

  • 查询道具将在几秒后过期,若剩余时间为 0,则表示该道具已过期;
  • 查询道具的失效日期,可精确到秒。
(4)案例:军棋每日签到

军棋每日签到中玩家签到规则为:需要记录玩家累计签到次数,根据玩家不同的累计签到次数发放相应的奖励,且签到次数达到一定数值时将累计签到次数重置。

该模式对每日签提供 2 种修改方式、2 种查询方式:

  • 修改
    • 修改玩家累计签到次数;
    • 重置玩家累计签到次数。
  • 查询
    • 查询玩家累计签到次数;
    • 查询签到的时间,可精确到秒。

参考123

  1. 事件积分系统(EVT)应用说明.pdf ↩︎

  2. 事件积分系统(EVT)技术说明.pdf ↩︎

  3. 事件积分系统(EVT)应用说明_20191016.ppt ↩︎

本文由作者按照 CC BY 4.0 进行授权