V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
codingbody
V2EX  ›  问与答

有一个用户会话的统计问题,想咨询一下各位老哥。

  •  
  •   codingbody · 2021-05-12 16:12:09 +08:00 · 661 次点击
    这是一个创建于 1289 天前的主题,其中的信息可能已经有所发展或是发生改变。

    基本情况如下:

    我有两个接口:

    • config 接口

    • upload 接口

    1. 客户端先请求 config 接口,config 会返回当前服务器时间戳 timestampsessionid;

    2. 客户端再请求一次或多次 upload 接口,请求的参数有 config 接口返回的 timestampsessionid.

    154314

    我需要每隔 5min 统计 sessionid 持续时间在 30min 内的数量。

    意思是某个 sessonid 如:s1 持续时间在 30min 内算一次,在 60min 内算两次。

    我现在有一个方案是: 对每一个 upload 请求的 sessionid 做为 redis 的 key,setNX,TTL 为 30min, 如果设置成功计数器 +1,5min 后,计数器置 0 。

    这个方案的问题是,同一时刻有大量的 redis key 过期,想请教老哥们有没有好的解决方案。

    第 1 条附言  ·  2021-05-13 16:50:59 +08:00
    每一天用一个 redis key 统计当天不重复的 session 个数,数据结构为 hyperloglog

    假设某次 upload 上 报的 sessionid = s1
    s1 该次上报的时间减去该会话首次上报的时间和 30min 比较,
    小于 30min s1 记为 s1-0
    大于 30min 小于 60min s1 记为 s1-1
    大于 60min 小于 90min s1 记为 s1-2

    这个就把同一个 sessionid 按照持续时间的不同,标记为新的不同的 new-sessionid,放到 redis 定时统计出不重复的个数

    这样的好处的,key 数量可以控制,一天就一个,

    弊端也有:
    + 就是 hyperloglog 本质是概率算法,有 0.81% 的标准误差
    + 每天 23:30 之后的新会话,在 00:00 - 0:30 会被重复计数
    4 条回复    2021-05-15 10:49:25 +08:00
    RLinux
        1
    RLinux  
       2021-05-13 09:58:26 +08:00
    你说的我有点疑问:假设 30 分钟内算一次,那用户持续操作了 90 分钟,那就算三次。但你的业务说,用户会话统计,按我的理解,同个人只能算一次。
    用 redis 来存储,每访问一次更新一次 key 的存活时间。查询时,只有查这种类型 key 的数量就行了。如果你用户数量大并且存在峰值涌入的话,的确会有可能存在大量同时过期。仅仅是统计 不包括用户数据的话,试试内存存储来解决?
    codingbody
        2
    codingbody  
    OP
       2021-05-13 16:07:00 +08:00
    一个 session 持续了 90 min,算三次。业务上是按这个次数计费的,每个 session 每过 30min 就算一个计费单位。
    codingbody
        3
    codingbody  
    OP
       2021-05-13 16:07:57 +08:00
    RLinux
        4
    RLinux  
       2021-05-15 10:49:25 +08:00
    @codingbody 如果是收费的话 那就能理解为啥这样做了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5712 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:42 · PVG 09:42 · LAX 17:42 · JFK 20:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.