You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DynamoDB中如何统计用户截至今日的连续活动天数

DynamoDB 实现用户连续活动天数统计方案

先明确统计逻辑严格匹配给定规则:

  • 当日无活动直接返回0
  • 昨日无活动、当日有活动,连续天数计为1
  • 从当日开始倒推逐天校验,遇到第一个无活动的日期立刻终止,累计的有效天数就是最终结果

现有表结构的直接实现(无改造成本)

当前表字段为user_id(分区键)、last_update_on(epoch时间戳)、activity_type,不改结构的话按以下步骤实现:

  1. 先算好时间边界:确定业务需要支持的最大连续统计天数上限(比如最多统计365天,避免无意义的全表扫描),算出对应N天前0点的epoch时间戳,注意先按业务所在时区做偏移校正,比如东八区要先减8小时的秒数再做日期取整。
  2. 调用DynamoDB的Query接口,以user_id为查询条件,拉取该用户所有last_update_on大于等于上述N天前时间戳的活动记录。
  3. 对拉回的记录做去重处理:把每条记录的last_update_on转成对应自然日的日期标识(比如YYYY-MM-DD格式字符串,或者当日0点的时间戳),存入Set结构去重,得到该用户近N天的活跃日期集合。
  4. 从今日开始倒推逐天校验:
    • 今日不在活跃集合里,直接返回0
    • 初始计数设为1(当日先计入)
    • 从昨日开始逐天往前查,日期在集合里就计数+1,遇到不在集合里的日期立刻终止,返回计数即可。

注意:同个用户同一天可能有多条不同activity_type的记录,必须做日期去重,否则会出现重复计数问题。

生产环境高性能方案(推荐)

上面的方案在用户活动量很大的时候,会拉取很多冗余的同天多活动记录,延迟和成本都高,建议做最小化的表结构优化:

  • 方案一:新增日活聚合表
    新建一张专门存用户日活状态的表,分区键为user_id,排序键为active_date(存当日0点的epoch时间戳,或者YYYY-MM-DD字符串),只要用户当天产生任意类型的活动,就往这张表写一条对应记录,同个用户同一天只写一条(写入前做幂等校验,存在就跳过)。
    统计的时候直接Query这张表,按user_id匹配、active_date小于等于今日0点时间戳的条件倒序取结果,因为结果天然按日期从近到远排列,直接遍历比对日期是否连续就行,断档立刻停,不需要做额外去重,扫描行数等于用户实际连续活跃天数,性能极高。
  • 方案二:复用现有表加GSI
    不想建新表的话,就在现有表上建全局二级索引,索引分区键设为user_id,排序键设为last_update_on,查询的时候走索引拉取数据,后续去重和统计逻辑和无改造方案一致,比扫原表性能好很多,但还是要做同天去重。

内容的提问来源于stack exchange,提问作者newbir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:54:44