0

需要一些关于我目前正在使用的实现的反馈......

我创建了一个嵌入到我的网站中的 javascript 文件,该文件每 3 秒向端点发送一个请求。此请求具有为每个新访问者创建的唯一标识符。然后使用诸如 site_123_unique_identifier 之类的带有 json 编码值 {"load_time":189225} 的键将其添加到 redis。密钥有 5 秒的过期时间,由于我为每个访问者使用一个唯一标识符,它不会重复访问者,只会增加过期时间。

对于我们的实时仪表板,我们每隔几秒向后端发送一次请求,它会获取与 site_123* 匹配的所有键。然后,我遍历它返回的所有 redis 键,并在其上运行 json_decode 并将值相加。

这适用于每天获得数百万浏览量的网站吗?如果不是您推荐的解决方案,则必须使用 ie7+[xmlhttp 而不是套接字]

4

2 回答 2

3

架构

  • HASH site:[siteId]:[visitorId]每个访问者的哈希值,包含“loadt”、“onlinet”、“loc”、“avgSpeed”等字段...

  • ZSET site:visitorssiteId:visitorsId一个作为成员和作为值的全局 zset lastSeen_timestamp,用于手动密钥过期。

  • SET site:[siteId]一套所有的visitorId礼物siteId

  • SET site(可选)一组所有siteId

优点

  • 它可以工作,一切都在 Redis 中
  • 感谢HASH site:[siteId]:[visitorId]您可以为每个访问者存储/增加任意数量的属性

缺点

  • 您将不得不自己管理到期。一个 cron (例如每 5 秒)将必须检索到期visitorId时间:ZRANGE site:visitors (NOW()-5 seconds) -1

然后遍历所有成员并执行:

DEL site:(member_value)

然后从第一个成员中提取siteId并执行(visitorId每次都从成员中提取)

SREM site:[siteId] visitorId1 visitorId2 visitorId3

(请参阅下面关于 LUA 脚本的说明)

  • 每次你更新一个值时,HASH site:[siteId]:[visitorId]你都会有

执行:

ZADD site:visitors [siteId:visitorId] now()
SADD site:[siteId] [visitorId]

...连同HSETHINCRBY site:[siteId]:[visitorId] field value

  • 你不需要json_decode。例如,如果您想检索特定网站上当前访问者的数量,只需执行: SCARD site:[siteId]

  • 如果您需要检索当前连接到siteId的所有访问者的平均加载时间,最好的方法是使用LUA 脚本首先检索 visitorId,SMEMBER site:[siteId]然后循环遍历visitorId并将数据与 相加HGET site:[siteId]:[visitorId] loadt,除以len(visitorIds)完成: )

笔记

  • 您应该在 lua 中实现上述算法,以便在 Redis 中执行所有这些操作,只接收您需要的内容,请参阅EVAL
于 2013-10-30T07:59:50.157 回答
0

这在唯一访问者较少时有效,访问者数量变大,您将在 Redis 中获得许多键,并且当您在 Redis 上执行键 site_123* 时,Redis 服务器将阻塞,直到命令完成,在此阻塞期间, Redis 服务器不会处理任何其他查询。

您是否在计算每个访问者的在线时间?

于 2013-10-30T03:42:15.350 回答