对于我目前正在使用的实施需要一些反馈...
我创建了一个嵌入我网站的javascript文件,该文件每隔3秒向端点发送一次请求。此请求具有为每个新访问者创建的唯一标识符。然后使用某些键添加到redis,例如site_123_unique_identifier,其中包含json编码值{“load_time”:189225}。密钥有5秒的到期时间,因为我每个访问者使用一个唯一的标识符,它不会重复访问者,只会增加过期时间。
对于我们的实时仪表板,我们每隔几秒钟就会向后端发送请求,并且可以获取与site_123 *匹配的所有密钥。然后我遍历它返回的所有redis键并在其上运行json_decode并将值相加。
这适用于每天获得数百万次观看的网站吗?如果不是你推荐的解决方案,那么必须使用ie7 + [xmlhttp而不是套接字]
答案 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
<强>赞成强>
HASH site:[siteId]:[visitorId]
,您可以为每位访问者存储/增加任意数量的属性<强>缺点强>
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]
...以及HSET
或HINCRBY site:[siteId]:[visitorId] field value
您不需要json_decode
。例如,如果您想要检索特定网站上的当前访问者数量
只执行:
SCARD site:[siteId]
如果您需要检索当前连接到siteId
的所有访问者的平均加载时间,最好的方法是使用 LUA脚本来首先检索visitorId SMEMBER site:[siteId]
然后循环visitorId
并将数据与HGET site:[siteId]:[visitorId] loadt
相加,除以len(visitorIds)
,然后就完成了:)
注意强>
答案 1 :(得分:0)
当唯一访问者数量减少,访问者数量增加,Redis中获得许多密钥时,以及在Redis上执行密钥site_123 *时,Redis服务器将被阻止,直到命令完成,此期间阻止,Redis服务器不会处理任何其他查询。
您是否计算每位访客的在线时间?