2016-08-23 3 views
1

Ruby에서 캐시 서버를 코딩 중이며 저장하는 데이터의 만료 시간을 지정해야합니다. 따라서 사용자가 데이터를 foo 키 아래에 저장하면 예를 들어 만료 시간도 초 단위로 설정됩니다. 이 순간에 데이터를 삭제해야하므로이 스케줄링에서 스레드를 생성하고 그 시간이 될 때까지 잠자기 상태로 두는 것이 좋습니다.올바른 작업 예약 방법

Thread.new(@options[:exp_time], key) do |t, k| 
    exp = Time.now + t 
    sleep(t) 
    if @data.key?(k) && @data[k][:exp_time] <= exp #check if it hasn't been updated 
     @data.delete(k) 
    end 
end 

t는 사용자가 전송 한 시간이며 키는 데이터가 저장되는 키입니다. 사용자가 키에 저장된 데이터를 대체 할 수 있도록 만료 시간을 변경할 수도 있습니다. 나는 이것이 스레드의 좋은 사용인지 또는 너무 많은 리소스를 소비하는지 또는 더 쉬운 방법이 있는지 궁금해하고있었습니다. 어떤 종류의 보석이나 도서관도 사용할 수 없습니다. 어떤 도움을 주셔서 미리 감사드립니다.

답변

1

부하가 걸리면 매우 짧은 시간에 미친 수의 스레드가 생성 될 것입니다. 정말로 원하는 것은 요소가 만료 시간순으로 정렬되는 우선 순위 대기열과 첫 번째 항목이 만료되었는지 확인하고 처리 한 다음 만료 될 항목이 없을 때까지 반복 한 다음 잠시 다시 잠자기 상태로 돌아 오는주기적인 타이머입니다.

이런 종류의 것을 구현하는 루비 보석이 있습니다. 적절하게 수행 할 수있는 것이거나 직접 작성할 수도 있습니다. 너무 어렵지 않으므로 bsearch_index을 사용하면 빠르게 삽입 지점을 찾을 수 있습니다.

하나의 스레드가있는 단일 큐가 잠재적으로 수천 개의 스레드보다 훨씬 잘 작동한다고 생각합니다. 각 스레드는 상당한 양의 오버 헤드를 가지므로이 값을 최소한으로 유지하는 것이 가장 좋습니다.

+0

다시 한 번 감사 드리며, 잘못 보았습니다. 정확한 시간에 키를 삭제하는 유일한 방법이었습니다. 하지만 백개의 스레드가 실행되지 않는 것에 비해 몇 초가 더 걸릴 것입니다. –

+1

이렇게하면 소수의 밀리 초보다 뒤떨어져있을 가능성은 거의 없습니다. – tadman