按键名删除memcache,以特定字符串开头(gae、python)

按键名删除memcache,以特定字符串开头(gae、python),python,google-app-engine,memcached,Python,Google App Engine,Memcached,我用gae建立了一个博客,并在memcache中存储了许多条目,包括分页条目 存储这些页面的关键是使用查询对象和页面索引: @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

我用gae建立了一个博客,并在memcache中存储了许多条目,包括分页条目

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

@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
, 除此之外,我还存储了以
sitenameobj
开头的任何其他项目

在某些情况下,我只想清除所有分页缓存,但不知道如何清除。 我想知道是否有办法按以
NDB9
开头的键名删除memcache

是的,我发现了这样的功能

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

但是在第一个参数中,
key\u前缀
似乎只是添加到每个
,我只想按key\u前缀删除memcache。

不能按前缀删除键;您只能删除特定的密钥,或刷新缓存中的所有密钥

在这种情况下,您必须循环所有页面ID以生成所有可能的键。将这些信息传递给
delete\u multi()


key\u prefix
参数只是一种方便的方法;如果它们的前缀相同,则可以发送较短的“密钥”。如果您的所有密钥都以
NDB9
开头,请将其用作密钥前缀,然后发送一个没有该前缀的密钥列表。在查找要删除的密钥时,memcached服务器会将前缀添加到每个密钥。

使用memcache存储所有其他密钥

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

当您需要按模式删除键时,迭代此值并使用delete_multi删除这些键

不确定是否可以按开始名称删除键,但您可以看到memcached标记使某些缓存无效,因为在我的示例中,memcache键是通过查询生成的,因此不可能在所有分页键上循环,这就是我想使用前缀的原因。我现在确实使用了
flush\u all
,但如果有办法的话,我真的不想这样做。密钥中的密钥可能会在其子级之前从缓存中移出。如果发生这种情况,我们将失去删除它们的能力