按特定字符串前缀删除memcache键名 (gae,python)

3 投票
2 回答
2471 浏览
提问于 2025-04-18 08:02

我用 Google App Engine 搭建了一个博客,并把很多内容存储在了内存缓存中,包括分页的文章。

存储这些页面的关键是使用查询对象和页面索引:

@property
def _query_id(self):
    if not hasattr(self, '__query_id'):
        hsh = hashlib.md5()
        hsh.update(repr(self.query))
        self.__query_id = hsh.hexdigest()
    return self.__query_id

def _get_cache_key(self, page):
    return '%s%s' % (self._query_id, page)

在管理控制台中会显示为:NDB9:xxxxxx,除此之外,我还存储了其他以 sitename-obj 开头的项目。

在某些情况下,我想只清除所有的分页缓存,但我不知道该怎么做。我在想有没有办法通过以 NDB9 开头的键名来删除内存缓存?

是的,我找到了一种这样的功能,

delete_multi(keys, seconds=0, key_prefix='', namespace=None)

但似乎 key_prefix 只是加在第一个参数的每个 key 上,而我想要的是只通过 key_prefix 来删除内存缓存。

2 个回答

-1

使用memcache来存储其他所有的键。

keys = [key1, key2, key3 ....]

当你需要根据某种模式删除键时,可以遍历这个值,然后使用delete_multi来删除这些键。

2

你不能通过前缀来删除键;你只能删除特定的键,或者清空所有缓存。

在这种情况下,你需要遍历所有页面的ID,以生成所有可能的键。然后把这些键传给delete_multi()

key_prefix这个参数只是为了方便;如果你的所有键都有相同的前缀,你可以发送更短的“键”。比如,如果你所有的键都是以NDB9开头的,就可以把这个作为前缀,然后发送没有这个前缀的键列表。当memcached服务器查找要删除的键时,会自动把前缀加到每个键上。

撰写回答