【问题标题】:delete memcache by key name start with a specific string (gae,python)按以特定字符串开头的键名删除 memcache (gae,python)
【发布时间】:2014-07-20 01:36:04
【问题描述】:

我用 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, 除此之外,我存储了以sitename-obj开头的任何其他项目。

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

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

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

但似乎key_prefix 只是添加到第一个参数中的每个key 中,我只想通过key_prefix 删除memcache。

【问题讨论】:

  • 不确定是否可以按开始名称删除键,但可以看到 memcached 标记使某些缓存无效

标签: python google-app-engine memcached


【解决方案1】:

您不能通过前缀删除键;您只能删除特定键,或刷新所有缓存。

在这种情况下,您必须遍历所有页面 id 以生成所有 可能的键。将这些传递给delete_multi()

key_prefix 参数只是一种方便的方法;如果它们都具有相同的前缀,您可以发送较短的“密钥”。如果您的所有键都以NDB9 开头,则使用它作为键前缀,并发送一个没有该前缀的键列表。在查找要删除的键时,memcached 服务器会为每个键添加前缀。

【讨论】:

  • 因为我的memcache键是通过查询生成的,所以不可能遍历所有分页键,这就是我想使用前缀的原因。我现在确实使用flush_all,但如果有办法,我真的不想这样做。
【解决方案2】:

使用 memcache 存储所有其他键。

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

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

【讨论】:

  • 键的键可能会在它成为孩子之前从缓存中被逐出。如果发生这种情况,我们将无法删除它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 2022-11-28
  • 2020-12-12
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多