2010-12-17 56 views
1

我正在考慮將在線用戶存儲在memcached中。存儲在線用戶php + memcache

首先我想到了key => value對的數組,其中key將是上次訪問的用戶標識和值timestamp。

我的問題是,當有許多用戶當前在線(並且會有)時,它將會是相當大的數組。

由於memcached不是用來存儲大量數據的,你會如何解決它?最佳做法是什麼?

感謝您的輸入!

+0

你爲什麼需要這個?有什麼用於存儲用戶ID和時間戳? – 2010-12-18 06:54:26

回答

4

這種方法的問題是隻有在事先知道密鑰的情況下才能查詢memcache。這意味着您必須將整個在線用戶列表保存在一個已知密鑰下。每次用戶上線或離線時,都需要閱讀列表,調整列表並重寫它。這裏存在嚴重的競爭條件,因此您必須使用檢查和設置鎖定機制。

我不認爲你應該這樣做。考慮保留近期用戶點擊的數據庫表:

user_id: int 
last_seen: timestamp 

時間戳和user_id的索引。在線查詢朋友使用:

SELECT user_id FROM online WHERE user_id IN (...) AND timestamp > (10 minutes ago); 

定期檢查表並批量刪除舊的時間戳記行。

當您的網站變大時,您可以在user_id上對此表進行分片。

編輯:

其實,你可以做到這一點,如果你並不需要所有的查詢誰是在線的,但只需要知道如果某些用戶是否在線的用戶。

  1. 當用戶點擊一個頁面,

    memcache.set( 「在線」 + user_ID的,真實的,600/* 10分鐘* /);

  2. 要查看用戶是否在線,

    在線= memcache.get( 「在線」。+ USER_ID);

還應該有一種方法來多鍵查詢memcache,看起來。如果您添加一個memcache服務器,可能會發生一些奇怪的事情,但是如果您使用此信息將「在線」標記放在用戶名旁邊,這應該不是什麼大問題。

+0

謝謝,我知道競賽狀況。可能會實施某種數據庫存儲。 – 2010-12-18 10:53:15