我正在使用Mongodb來存儲用戶數據,包括用戶狀態(在線|離線|忙碌)。到期時間僅需幾秒鐘。如果用戶在幾秒鐘後沒有顯示(發送Keepalive請求),我想將狀態設置爲離線。如何縮放auth_token的非常短的失效時間?
我正在尋找一個可擴展的解決方案。我正在考慮添加'lastseen'屬性並運行cron作業來更新狀態,但我認爲它不可擴展。
有沒有更好的方法來做到這一點?我如何使用Redis或Memcashed來幫助我?
我正在使用Mongodb來存儲用戶數據,包括用戶狀態(在線|離線|忙碌)。到期時間僅需幾秒鐘。如果用戶在幾秒鐘後沒有顯示(發送Keepalive請求),我想將狀態設置爲離線。如何縮放auth_token的非常短的失效時間?
我正在尋找一個可擴展的解決方案。我正在考慮添加'lastseen'屬性並運行cron作業來更新狀態,但我認爲它不可擴展。
有沒有更好的方法來做到這一點?我如何使用Redis或Memcashed來幫助我?
您可以使用TTL集合。 http://docs.mongodb.org/manual/tutorial/expire-data/
可以工作的一種技術是使用last_seen時間戳的會話集合。 TTL集合將被配置爲在last_seen時間戳超過X秒之前刪除會話。只要會話處於聯機狀態,您就會定期刷新last_seen時間戳,以防止它被清除。
實施例:
設置的TTL集合:
db.sessions.ensureIndex({last_seen:1},{expireAfterSeconds:60});
平保持會話存活(或創建它,如果它是不存在的話)
db.sessions.update({_id:,last_seen:},{UPSERT:真});看
查詢,如果用戶是在線:
會話= db.sessions.find({_id:})
我有「忙」狀態,以及,不幸的是我覺得這個搜索解決方案在這種情況下n將不起作用。 – Amer
@Amer:然後你可以給會話集合添加一個狀態,或者是一個「繁忙」標誌。這似乎是一個好方法。你可以使用[EXPIRE](http://redis.io/commands/expire)在redis中對此進行建模,但@ jared的解決方案更可取,因爲你已經在Mongo上了。 –