1

我想在 memcache 中缓存查询以加快阅读速度。为此,我需要一些函数来创建一些用于查询的 id。

class DeleteMe(db.Model)
    pass

query = DeleteMe.all()

# how to get query string/hash form query?
# how to get kind name from query?

我想做这样的事情(getQueryKey 是一个函数,它总是为相同的查询提供相同的值):

memcache.set(getQueryKey(query), list(query))

请帮助我,它可以是 db 或 ndb。

4

3 回答 3

4

有类似的问题;这是我的代码:

    def keyFromQuery( query ):
            """
                    Derives a unique Key from a given query.
                    This Key is stable regardless in which order the filter have been applied
                    @param query: Query to derive key from
                    @type query: DB.Query
                    @returns: string
            """
            origFilter = [ (x, y) for x, y in query._get_query().items() ]
            for k, v in query._Query__orderings:
                    origFilter.append( ("__%s ="%k, v) )
            origFilter.append( ("____kind", query._model_class().kind() ) )
            origFilter.sort( key=lambda x: x[0] )
            filterKey = "".join( ["%s%s" % (x, y) for x, y in origFilter ] )
            return( sha256( filterKey ).hexdigest() )
于 2013-06-01T21:50:19.497 回答
1

使用 ndb 和 memcache 查询结果(keys_only)。

def myquery_cached(flush_cache=False):
    key = 'My Query Key'    # make this unique to this query
    ctx = ndb.get_context()
    # if flush_cache is True, skip the cache and run the query
    myclass_keys = None if flush_cache else ctx.memcache_get(key).get_result()
    if not myclass_keys:
        myclass_keys = MyClass.query(...).fetch(keys_only=true)  # the actual query
        ctx.memcache_set(key, myclass_keys)    # store the keys
    return ndb.get_multi(myclass_keys)         # this uses ndb's caching

在此代码被调用一次以填充缓存后,每次后续都会进行两次 memcache 查询以检索所有结果。

当你想刷新缓存时,调用 myquery_cached(True)

于 2013-06-07T19:10:15.853 回答
1

这真的没有意义。查询不是值得缓存的东西:它只是一个无状态对象,很容易在一行代码中重新创建。缓存用于实际数据,从数据存储中获取这些数据的成本很高。

如果您需要轻松引用一系列查询,更好的解决方案可能是将它们简单地存储在字典中,无论是在模块级别还是作为相关模型的类属性。

于 2013-06-01T19:47:34.593 回答