php - REST 服务和内存缓存

标签 php rest memcached wrapper key-value

我正在考虑为我的大规模 REST 服务启用 Memcache 支持。但是,我对这些键值存储的最佳方法有一些疑问。

设置:

  • 一个数据库包装器,具有选择、更新等功能。
  • 包含所有 API 函数(getUser、createUser 等)的 REST 框架

在我看来,理想的方法是将 Memcache 集成到数据库包装器中,因此,例如,每个 SQL 查询都将进行 md5 哈希处理并保存在缓存中(顺便说一下,这是大多数在线资源所建议的)。然而,这种方法显然存在一个问题:如果一个搜索查询已经被缓存,并且搜索结果中的一个用户在缓存结果之后被更新,这不会反射(reflect)在下一个请求中(因为它现在在缓存)。

在我看来,我有几种处理方法:

  • 在 REST 框架中为每个函数(getUser、createUser 等)实现 Memcache,从而在用户更新时显式处理缓存更新等。这可能会导致冗余代码。
  • 让缓存值快速过期并接受某些请求显示旧缓存值的事实。
  • 在数据库包装器中执行更高级的 Memcache 实现,以便我可以确定要更新的部分(例如用户),例如搜索请求。

您能否指导我采用以下哪一种方法,或采取另一种完整的方法? 提前致谢。

最佳答案

为 Web 应用程序启用缓存并非易事。

也许您已经这样做了……我建议您首先根据业务需求或预测提出一个目标(例如:每秒必须接受 1000 个请求)然后适本地对您的系统进行压力测试以在您之前获得数字开始改变任何事情,然后找出你的瓶颈。

我通常使用分析工具,例如 HXProf(来自 facebook)。

缓存所有数据以镜像数据库可能不是最佳方法。

找出您可以为缓存分配的大小。如果您的架构只允许您为内存缓存分配 100MB,那么这将影响您对缓存内容和缓存时间的决定。

最好的缓存就是永远缓存。但我们都知道数据会发生变化。您可以先缓存经常请求且需要最多资源才能获取的数据。

始终尝试确保您没有在努力改进会使您进步缓慢的事情。

在不深入了解您的架构的情况下,任何人推荐最适合您需求的缓存策略都是危险的。

也许您应该缓存网络服务的结果输出?例如使用反向代理(@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 分钟,因为聊天系统有我的旧声誉数据并且还不知道我的声誉已经增加到足以让我聊天。有些数据可能会过时,而其他类型的数据永远不会过时。在缓存数据时考虑这一点。

结论

根据我上面谈到的因素,您的方法都是有效的。事实上,您可以将这些组合用于要缓存的所有不同类型的数据,以及可以接受为它们显示旧数据的时间长度。也许类别或国家/地区列表(因为它们不经常更改)可以缓存很长时间,而声誉(或所有用户一直在更改的任何数据)应该只缓存很短的时间。

关于php - REST 服务和内存缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711646/

相关文章:

java - 使用 JUnit 测试休息服务

javascript - 在 AngularJS 中调用 GET 后, Controller 内对象的值不会改变?

PHP、MySQL内存数据库和memcached

java - 在多个线程中调用多个rest/soap服务并等待它们的响应

session - memcached 有必要复制它的数据吗?

python - 按以特定字符串开头的键名删除内存缓存(gae,python)

php - MySQL Rank,无法正常工作

php - 从另一个类访问数据库类

php - 在 Phpmyadmin 中创建 Concat 触发器

php - 获取 UTF-8 字符串的第一个字符