Javascript实时访客信息

时间:2013-10-30 02:19:03

标签: javascript php redis real-time

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

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

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

这适用于每天获得数百万次观看的网站吗?如果不是你推荐的解决方案,那么必须使用ie7 + [xmlhttp而不是套接字]

2 个答案:

答案 0 :(得分:3)

<强>模式

  • HASH site:[siteId]:[visitorId]每个访问者的哈希,其中包含“loadt”,“onlinet”,“loc”,“avgSpeed”......

  • ZSET site:visitors一个全局zset,其中siteId:visitorsId为成员,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

答案 1 :(得分:0)

当唯一访问者数量减少,访问者数量增加,Redis中获得许多密钥时,以及在Redis上执行密钥site_123 *时,Redis服务器将被阻止,直到命令完成,此期间阻止,Redis服务器不会处理任何其他查询。

您是否计算每位访客的在线时间?