2013-02-06 43 views
0

我正在使用Mongodb來存儲用戶數據,包括用戶狀態(在線|離線|忙碌)。到期時間僅需幾秒鐘。如果用戶在幾秒鐘後沒有顯示(發送Keepalive請求),我想將狀態設置爲離線。如何縮放auth_token的非常短的失效時間?

我正在尋找一個可擴展的解決方案。我正在考慮添加'lastseen'屬性並運行cron作業來更新狀態,但我認爲它不可擴展。

有沒有更好的方法來做到這一點?我如何使用Redis或Memcashed來幫助我?

回答

1

您可以使用TTL集合。 http://docs.mongodb.org/manual/tutorial/expire-data/

可以工作的一種技術是使用last_seen時間戳的會話集合。 TTL集合將被配置爲在last_seen時間戳超過X秒之前刪除會話。只要會話處於聯機狀態,您就會定期刷新last_seen時間戳,以防止它被清除。

實施例:

  1. 設置的TTL集合:

    db.sessions.ensureIndex({last_seen:1},{expireAfterSeconds:60});

  2. 平保持會話存活(或創建它,如果它是不存在的話)

    db.sessions.update({_id:,last_seen:},{UPSERT:真});看

  3. 查詢,如果用戶是在線:

    會話= db.sessions.find({_id:})

    • 如果返回一個文件,則用戶在線
    • 如果沒有文件的回報,那麼它們是離線
+0

我有「忙」狀態,以及,不幸的是我覺得這個搜索解決方案在這種情況下n將不起作用。 – Amer

+0

@Amer:然後你可以給會話集合添加一個狀態,或者是一個「繁忙」標誌。這似乎是一個好方法。你可以使用[EXPIRE](http://redis.io/commands/expire)在redis中對此進行建模,但@ jared的解決方案更可取,因爲你已經在Mongo上了。 –