1

我正在使用Python-RQ创建一个工作,当你创建一个工作时你会得到一个 job.id:

f311ae30-b623-4b38-9dcb-0edd0133a6e6

然后我用那个id来检查结果是否完成,这很好。

然后将此结果缓存(500 秒)。

现在,这就是我感到困惑的地方。

当另一个请求在 500 秒的时间范围内以相同的输入集出现时:

{'blah': u'123456', 'title': u' Some Title', 'variable': 123}

如何取回该作业的缓存结果与创建另一个作业。

我的问题是 job.id 是一些哈希,包括时间戳等,所以我不确定如何在 redis 中查找结果。

我到处搜索过,但没有在任何地方看到此文档,以便在不创建新作业的情况下利用缓存结果的最佳方式。

4

1 回答 1

1

我想出了一个可能对其他人有帮助的解决方案。

基本上,创建一个输入摘要(给 RQ 工作人员),这样我们就可以在另一个相同的请求进来时进行查找,这将是哈希名称。键是'job_key',值是我们需要的job.id。

当另一个请求与之前处理的请求相同时,我们现在可以找到并提供结果,而无需再次执行相同的工作。

此外,作为故障保险,为作业增加了一些额外的秒数,因此当另一个函数请求缓存的 job.result 时,它仍然存在并且不会在调用之间被垃圾收集器删除。

*请求,如果有人有一些见解,如果有更好的方法来处理内存消耗的哈希 - > job.id(键,值),类似于这个这个请让我知道。(这两个链接指的是如何使用散列与常规字符串使用更少的内存来使用某种算法以某种方式存储键/值,以使每个散列具有 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)
于 2013-04-12T19:45:20.890 回答