我正在考虑为我的大型REST服务启用Memcache支持。但是我对这些键值存储的最佳方法有一些疑问。
设置:
在我的脑海中,理想的方法是将Memcache集成到数据库包装器中,例如,每个SQL查询都会获得md5-hashed并保存在缓存中(这是大多数在线资源所建议的)。但是,这种方法显然存在一个问题:如果已经缓存了搜索查询,并且在缓存结果之后更新了搜索结果中的一个用户,则这不会反映在下一个请求中(因为它现在位于高速缓冲存储器)。
正如我所看到的,我有几种方法可以解决这个问题:
您可以指导我采取以下哪种方法或另一种方法吗? 提前致谢。
答案 0 :(得分:2)
为Web应用程序启用缓存不是一件容易的事。
也许你已经完成了这一点......我建议你首先根据业务需求或预测(例如:每秒必须接受1000个请求)提出目标,然后对你的系统进行适当的压力测试以获得数字开始改变任何事情然后找出你的瓶颈。
我通常使用分析工具,例如HXProf(facebook)。
缓存所有数据以镜像数据库可能不是最佳方法。
了解您可以为缓存分配多大的内容。如果您的架构只允许为内存缓存分配100MB,那么它将影响您对缓存内容以及缓存时间的决定。
最好的缓存是永久缓存。但我们都知道数据会发生变化。您可以从缓存经常请求的数据开始,并且需要获取最多的资源。
始终努力确保您不会改进能够让您获得低改善的东西。
如果不深入了解您的架构,任何人都应该推荐最适合您需求的缓存策略。
也许您应该缓存Web服务的重新输出?例如,使用反向代理(@Darrel正在讨论的内容)或使用输出缓冲...
在考虑缓存之前优化数据库查询。确保使用PHP Op缓存(如APC)以及所有标准做法。
如果要缓存数据并防止过时/旧数据被提供,诀窍是识别您的数据(可能是主键?)以及更新或删除数据时,您删除或更新该标识符的缓存
<?php
// After inserting into DB, you can also put it in the cache
$memcache->set($userId, $userData);
// After updating or deleting the user, you update or delete the data
$memcache->delete($userId);
很多网站都会显示过时的数据。当我在stackoverflow上,我的声誉增加,然后我进入stackoverflow聊天,显示的声誉是我的旧声誉。当我获得20的声誉(聊天所需的声誉)时,我仍然无法聊聊另外5分钟因为聊天系统有我原来的声誉数据而且还不知道我的声誉已经增加到足以让我聊天。有些数据可能是陈旧的,而其他类型的数据永远不应该过时。在缓存数据时考虑一下。
<强>结论强>
根据我上面讨论的因素,您的方法都可以有效。实际上,您可以将这些组合用于要缓存的所有不同类型的数据以及为它们显示旧数据的可接受时间。也许国家的类别或列表(因为它们不经常更改)可以缓存很长一段时间,而声誉(或所有用户的所有数据一直在变化)应该只在短时间内缓存。