2013-10-30 27 views
0

需要我目前使用的實現一些反饋...的Javascript實時訪客信息

我創建的嵌入到我的網站,發送請求每3秒到端點的JavaScript文件。該請求具有爲每個新訪客創建的唯一標識符。然後使用json編碼的值{「load_time」:189225},使用site_123_unique_identifier等關鍵字將其添加到redis中。這些密鑰有5秒的過期時間,因爲我爲每個訪問者使用了一個唯一的標識符,它不會重複訪問者,只會增加過期時間。

對於我們的實時儀表板,我們每隔幾秒發送一次請求到後端,它會匹配所有匹配site_123 *的密鑰。然後,我循環遍歷所有返回的redis鍵,並在其上運行json_decode並將這些值相加。

這是否適用於每天獲得數百萬次瀏覽量的網站?如果不是您推薦的解決方案,則必須使用ie7 + [xmlhttp而不是套接字]

+0

它不起作用。 Redis是關於即時聚合數據,而不是積累數據以便離線處理數據。 –

回答

3

模式

  • HASH site:[siteId]:[visitorId]每個遊客的哈希包含 「loadt」, 「onlinet」, 「祿」, 「avgSpeed」 領域......

  • ZSET site:visitors全球zset其中siteId:visitorsId爲成員,lastSeen_timestamp爲值,用於手動密鑰過期。

  • SET site:[siteId]siteId

  • SET site(可選)一組的所有siteId

優點

  • 它的工作原理和內部的一切活了一組所有visitorId禮物Redis
  • 感謝HASH site:[siteId]:[visitorId]您可以存儲/遞增任意數量的屬性爲每個遊客

缺點

  • 你將不得不管理自己即將到期。一個cron(各〜5秒實例)將必須檢索到期visitorId用:ZRANGE site:visitors (NOW()-5 seconds) -1

然後遍歷所有成員和執行:

DEL site:(member_value) 

然後從第一構件網站ID提取並執行(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腳本先用SMEMBER site:[siteId]則環比visitorId檢索visitorId和len(visitorIds)HGET site:[siteId]:[visitorId] loadt,除彙總數據,你就大功告成了:)

注意

  • 你應該實現在Lua上述算法,以做內部的Redis所有這些東西只接收你需要什麼,看到EVAL
+1

感謝這一點,起初我不太明白,但不是那個谷歌的; D –

0

這適用於獨立訪問者較少時,訪問者數量變大,您將在Redis中獲得許多密鑰,以及當您在Redis上執行密鑰site_123 *時,Redis服務器將被阻塞,直到命令完成,在此塊期間,Redis服務器將不處理任何其他查詢。

你計算每個訪問者的在線時間嗎?

+0

我們很快就會加入像那樣的信息,在線時間,地點,平均加載速度,他們在哪個頁面上 –