4

質問: ジョブの結果がすぐに破棄されると、redis がいっぱいになるのはなぜですか?

redis をキューとして使用して PDF を非同期的に作成し、結果をデータベースに保存しています。保存されているため、後でオブジェクトにアクセスする必要がないため、処理後に結果を Redis に保存しておく必要はありません。

結果が redis にとどまらないようにするために、次のように設定しTTLました0

parameter_dict = {          
    "order": serializer.object,
    "photo": base64_image,
    "result_ttl": 0
}
django_rq.enqueue(procces_template, **parameter_dict)

問題は、redis ワーカーがジョブの有効期限がすぐに切れると言っていることです。

15:33:35 Job OK, result = John Doe's nail order to 568 Broadway
15:33:35 Result discarded immediately.
15:33:35
15:33:35 *** Listening on high, default, low...

Redis はまだいっぱいになり、次のようにスローします。

ResponseError: command not allowed when used memory > 'maxmemory'

ジョブの結果がまだ保存されていない場合に redis がいっぱいにならないように、redis / django-rq に設定する必要がある別のパラメーターはありますか?


アップデート:

この投稿に続いて、redis でジョブが失敗したためにメモリがいっぱいになる可能性があると思います。

このコード スニペットの使用:

def print_redis_failed_queue():
    q = django_rq.get_failed_queue()
    while True:
        job = q.dequeue()
        if not job:
            break
        print job

以下は、redis のキーのダンプのペースト ビンです。

http://pastebin.com/Bc4bRyRR

ここに投稿するには実用的であるには長すぎます。そのサイズは私の理論を支持しているようです。しかし、使用:

def delete_redis_failed_queue():
    q = django_rq.get_failed_queue()
    count = 0
    while True:
        job = q.dequeue()
        if not job:
            print "{} Jobs deleted.".format(count)
            break
        job.delete()
        count += 1  

私が期待するようにredisをクリアしません。redis でキーのより正確なダンプを取得するにはどうすればよいですか? ジョブを正しくクリアしていますか?

4

2 に答える 2

1

http://python-rq.org/docs/exceptions/の「ブラックホール」例外ハンドラーを次のように使用できますjob.cancel()

def black_hole(job, *exc_info):
    # Delete the job hash on redis, otherwise it will stay on the queue forever
    job.cancel()
    return False
于 2014-12-02T20:46:02.693 に答える