sql >> データベース >  >> NoSQL >> Redis

クレームの有効期限が切れたRedisキュー

    クラッシュしたジョブを再送信するために使用できるredisの単純なキューを実現するには、次のようにします。

    • 1つのリスト「up_for_grabs」
    • 1つのリスト"being_worked_on"
    • 自動期限切れロック

    仕事をつかもうとしている労働者は、次のようなことをします:

    timeout = 3600
    #wrap this in a transaction so our cleanup wont kill the task
    #Move the job away from the queue so nobody else tries to claim it
    job = RPOPLPUSH(up_for_grabs, being_worked_on)
    #Set a lock and expire it, the value tells us when that job will time out. This can be arbitrary though
    SETEX('lock:' + job, Time.now + timeout, timeout)
    #our application logic
    do_work(job)
    
    #Remove the finished item from the queue.
    LREM being_worked_on -1 job
    #Delete the item's lock. If it crashes here, the expire will take care of it
    DEL('lock:' + job)
    

    そして時々、リストを取得して、そこにあるすべてのジョブが実際にロックされていることを確認することができます。ロックされていないジョブが見つかった場合、これは期限切れになり、ワーカーがクラッシュした可能性があることを意味します。この場合、再送信します。

    これはそのための擬似コードになります:

    loop do
        items = LRANGE(being_worked_on, 0, -1)
        items.each do |job| 
            if !(EXISTS("lock:" + job))
                puts "We found a job that didn't have a lock, resubmitting"
                LREM being_worked_on -1 job
                LPUSH(up_for_grabs, job)
            end
        end
        sleep 60
    end
    


    1. MongoDbで15分の時間間隔で結果をグループ化します

    2. ネストされた構造体をmgoで保存する

    3. エラー99がlocalhost:6379に接続しています。要求されたアドレスを割り当てることができません

    4. MongoDB diacriticInSensitive検索では、すべてのアクセント付き(発音区別符号付きの単語)行が期待どおりに表示されない、またはその逆