App引擎 - 什么时候使用memcache vs搜索索引(和搜索API)?

时间:2014-05-14 00:57:56

标签: python google-app-engine

我有兴趣在我的应用中添加一个拼写检查器 - 我计划使用带有自定义单词列表的difflib,该单词列表大~147kB(13,025个单词)。

在针对此列表测试用户查询时,它会更有意义:

  1. 将字典加载到memcache(我想从数据存储区?)并将其保存在memcache或
  2. 为Search API构建索引并在其中传递用户查询
  3. 我想我要问的是哪个更快:memcache还是搜索索引?

    感谢。

2 个答案:

答案 0 :(得分:1)

Memcache肯定更快。

另一个重要的考虑因素是成本。 Memcache API调用是免费的,而Search API调用有自己的quota and pricing

顺便说一句,您可以将库存储为静态文件,因为它很小并且不会更改。无需将其存储在数据存储区中。

答案 1 :(得分:1)

Memcache更快,但您需要考虑以下事项。

  1. 它不可靠,任何时候都可以清除实体。因此,您的代码需要对非缓存数据进行回退

  2. 您只能通过密钥获取,因此您说需要将整个字典存储在memcache对象中。

  3. 每个内存缓存实体只能存储1MB。如果字典较大,则必须跨越多个实体。好吧,与您的情况无关。

  4. 还有其他一些选择。字典会多久更新一次?

    这是另一种策略。

    如果要在应用更新之外更新字典,可以将其存储在文件系统(需要应用更新)或GCS中。然后,您可以在启动时或第一次请求时将每个实例中的字典加载到内存中,并将其缓存在正在运行的实例级别,然后您将不会有任何往返服务添加延迟的往返。这也将是更简单的代码方式(即如果不在memcache中则没有回退等)

    这是一个例子。在这种情况下,代码存在于模块中,该模块根据需要导入。我使用yaml文件进行其他配置,它可以像json一样轻松加载字典,或者你可以在模块中定义一个python字典。

    _modsettings = {}
    
    def loadSettings(settings='settings.yaml'):
    
        x= _modsettings
        if not x:
            try:
                _modsettings.update(load(open(settings,'r').read()))
            except IOError:
                pass
    
        return _modsettings
    
    settings = loadSettings()
    

    然后,只要我想要设置字典,我的代码就会引用mymodule.settings。 通过在预热请求期间导入此模块,您将不会遇到竞争条件,或者必须在面向用户的请求期间导入/解析字典。您可以根据需要输入更多错误陷阱; - )