2013-02-06 1 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

나는 불행하게도 나는이 solutio 생각뿐만 아니라, '통화 중'상태가 오프라인 이 상황에서는 n이 작동하지 않습니다. – Amer

+0

@Amer : 그러면 세션 컬렉션에 상태를 추가 할 수 있습니다. 대신 'busy' 플래그를 사용할 수 있습니다. 그것은 좋은 접근법처럼 보인다. [EXPIRE] (http://redis.io/commands/expire)를 사용하여 redis로 모델링 할 수 있지만 이미 mongo를 사용하고 있으므로 @ jared의 솔루션이 바람직합니다. –

관련 문제