2009-07-11 6 views
2

memcached 저장소 옵션을 사용하여 활성 세션 수를 계산하는 가장 직접적이고 안전한 방법을 알아 내려고합니다. DB 기반 세션 저장을 사용하면 테이블의 행 수를 계산할 수 있지만 memcached를 사용하여 동일한 작업을 수행 할 수는 없습니다.레일스 - 활성 세션 목록

덕분에, 크람

답변

0

난 당신이 memcache에와 있다고 할 수 있다고 생각하지 않습니다.

필자는 아직 MemCacheStore를 사용하고 있지만 데이터베이스의 cron 작업과 테이블이있는 응용 프로그램 컨트롤러의 필터를 사용하여 구현할 수 있습니다.

1

Memcache는 명시 적으로 사용중인 키를 반복하는 방법을 제공하지 않습니다. 특정 키를 기준으로 읽거나 쓸 수 있지만 이 아닌 키를 모두 가져 오거나 반복 할 수 있습니다. 이것은 memcache의 한계입니다.

불행히도 before_filter은 앱에 대한 알림없이 memcached에서 세션이 만료 될 수 있기 때문에 작동하지 않습니다.

왜이 정보를 얻고 싶습니까?

+0

안녕하세요, 답변 해 주셔서 감사합니다. 이 정보를 통해 로그인 여부에 관계없이 사이트의 사용자 수를 표시하고 싶습니다. Vikram –

0

나는이 게시물이 정말로 오래되었음을 알고 있지만 여기에 잠재적 인 해결책을 추가하고 어떤 종류의 의견이 커뮤니티에서 왔는지 보았습니다.

우리는 조각 캐싱 (및 다른 것들)을 위해 memcached를 사용하기 때문에 세션을 memcached로 옮길 것을 고려하고 있습니다. 이 방법은 내 컴퓨터에서 작동하지만 코드를 정리하고보다 강력한 환경에서 테스트 할 기회가 없습니다.

해결책은 간단합니다. 그것은시 : 분을 기준으로 키를 사용하고 세션이 확장 될 때 키를 증가/감소시킵니다. 세션이 들어온 버킷 (키)이 반환되어 세션에 저장됩니다. 세션이 다음에 앱에 도달하면 이전 버켓이 count 메소드에 제공됩니다. 세션 키 사이를 이동할 수 있습니다 그 방법은 (새 버킷 이전 버킷에서 이동) 여기

은 방법 :

def count(previous_bucket) 
    # All this does is construct a key like this: 
    # _session_counter_10:15 
    key = KEY_PREFIX + time_key(Time.now.hour, Time.now.min) 

    # do nothing if previous bucket = key 
    return key if previous_bucket.present? && key.eql?(previous_bucket) 

    # Increment the count in the cache 
    Rails.cache.increment(key, 1, expires_in: 30.minutes) 

    # If there is a previous bucket, decrement the count there 
    if previous_bucket.present? 
     Rails.cache.decrement(previous_bucket, 1) 
    end 

    # Return the key used so it can be stored in the session which was counted. This will be returned on the next 
    # call to bump to keep the numbers accurate 
    return key 
end 

사용하려면, 호출 방법은이 일을한다 :

counter = SessionCounter.new 
session[:counter_bucket] = counter.count(session[:counter_bucket]) 

주어진 시간대에 세션 수를 얻으려면, 해당 기간 동안 키 배열을 구성한 다음 read_multi를 사용하여 그 시간의 카운트를 검색하면됩니다. 예를 들어

:

keys = ["_session_count_10:15","_session_count_10:14","_session_count_10:13"] 
values = Rails.cache.read_multi(*keys) 

값은 일치하는 키를 포함하는 해시이다. 키의 값을 합하여 해당 기간의 카운트를 얻으십시오.

질문 :

  • 윌이 규모? 앱이 과부하 상태 일 때 캐시에서 카운터를 증가/감소시키는 많은 히트가있을 것입니다. 앱이 느려지 게하는 열쇠가 잠길 것인가? 내가 증분/감소 섹션을 스레드에 넣는 방법에 대해 생각했지만 알려진 문제가있을 때까지 성능을 조정하지 마십시오.

업데이트 : 우리는이 패턴을 구현 및 생산에 넣어 한

. 그것은 우리를 위해 정말 잘 진행되어 왔고 성능 문제는 아직 나타나지 않았습니다.

관련 문제