我有兴趣在我的应用中添加一个拼写检查器 - 我计划使用带有自定义单词列表的difflib,该单词列表大~147kB(13,025个单词)。
在针对此列表测试用户查询时,它会更有意义:
我想我要问的是哪个更快:memcache还是搜索索引?
感谢。
答案 0 :(得分:1)
Memcache肯定更快。
另一个重要的考虑因素是成本。 Memcache API调用是免费的,而Search API调用有自己的quota and pricing。
顺便说一句,您可以将库存储为静态文件,因为它很小并且不会更改。无需将其存储在数据存储区中。
答案 1 :(得分:1)
Memcache更快,但您需要考虑以下事项。
它不可靠,任何时候都可以清除实体。因此,您的代码需要对非缓存数据进行回退
您只能通过密钥获取,因此您说需要将整个字典存储在memcache对象中。
每个内存缓存实体只能存储1MB。如果字典较大,则必须跨越多个实体。好吧,与您的情况无关。
还有其他一些选择。字典会多久更新一次?
这是另一种策略。
如果要在应用更新之外更新字典,可以将其存储在文件系统(需要应用更新)或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
。
通过在预热请求期间导入此模块,您将不会遇到竞争条件,或者必须在面向用户的请求期间导入/解析字典。您可以根据需要输入更多错误陷阱; - )