2016-08-23 4 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

これは負荷の下に置かれている場合、非常に短時間で狂った数のスレッドを作成するつもりです。あなたが本当に望むのは、要素が有効期限でソートされる優先度キューと、最初のエントリが期限切れであるかどうかをチェックして処理し、期限切れになるまで何度も繰り返す定期的なタイマーです。

Rubyの宝石の中には、このようなものを実装しているものがあります。適切に実行するものがあれば、bsearch_indexを使ってすぐに挿入ポイントを見つけることが難しくありません。

私はあなたが1つのスレッドを持つキューが潜在的に何千ものスレッドよりもはるかに優れていると思います。各スレッドにはかなりのオーバーヘッドがありますので、最小限に抑えるのが最善です。

+0

もう一度、ありがとう、それは間違って見えますが、それは正確な時刻にキーを削除する唯一の方法でした。しかし、数百秒のスレッドを実行していないのに比べて数秒はかかります –

+1

これを正しく実行すると、数ミリ秒以上遅れることはほとんどありません。 – tadman

関連する問題