我正在使用Python-RQ创建作业,当您创建作业时,您会得到一个job.id:
f311ae30-b623-4b38-9dcb-0edd0133a6e6
然后我使用这个id来检查结果是否已经完成,这很棒。
然后这个结果被缓存(500秒)。
现在,这就是我感到困惑的地方。
当另一个请求在500秒的时间范围内以相同的一组输入传入时:
{'blah': u'123456', 'title': u' Some Title', 'variable': 123}与创建另一个作业相比,如何取回该作业的缓存结果。
我的问题是job.id是一些散列,包括时间戳之类的,所以我不确定如何在redis中查找结果。
我到处都在搜索,但没有看到任何地方有文档说明如何在不创建新作业的情况下利用缓存结果的最佳方法。
发布于 2013-04-13 03:45:21
我想出了一个可能对其他人有帮助的解决方案。
基本上,创建输入的摘要(到RQ worker),这样当另一个相同的请求进来时,我们就可以查找一些东西,这将是哈希名。关键字将是'job_key‘,值将是我们需要的job.id。
当另一个请求与之前处理的请求相同时,我们现在可以找到并提供结果,而不必再次执行相同的工作。
此外,就像故障保险一样,为作业增加了一些额外的秒数,因此当缓存的job.result被另一个函数请求时,它仍然在那里,并且不会在调用之间被垃圾回收器删除。
*请求,如果有人有一些见解,如果有更好的方法来处理哈希-> job.id (键,值)对内存消耗,类似于this和this,请告诉我。(这两个链接指的是如何使用数量更少的内存,使用散列而不是常规字符串,以便以某种方式存储键/值,使用某种算法,使每个哈希具有100个键/值)。
下面是好的方面:
# Seconds before cached records expire
cache_expire = 500
# Create hash of parameters, to use as a lookup for job.id (cache)
hash = hashlib.sha1()
for param in search:
hash.update(str(search[param]))
url_hash = 'url:{0}'.format(hash.hexdigest())
# Check if we have a cached result, need old job_key
job_key = r.hget(url_hash, 'job_key')
if job_key:
job_hash = 'rq:job:{0}'.format(job_key)
ttl = r.ttl(job_hash)
if ttl:
# Add 30 more seconds of buffer room
# to ensure job.result doesn't get deleted pre-maturely
r.expire(job_hash, ttl+30)
return jsonify(search_id=job_key)
else:
# Job result has already been deleted, clear lookup hash
r.delete(url_hash)
# Create new job
job = q.enqueue_call(func=worker.search, args=(search,), result_ttl=cache_expire)
# Create job.id lookup using hash as key (for cache)
if r.hsetnx(url_hash, 'job_key', job.id):
r.expire(url_hash, cache_expire)
return jsonify(search_id=job.id)https://stackoverflow.com/questions/15909733
复制相似问题