以下,或者是 内存缓存 </跨度> 已经足够好了吗?
function getUser2($ uid){ static $ localcache = []; if(isset($ localcache [$ uid]))return $ localcache [$ uid]; return $ localcache [$ uid] = getUser($ uid);}
鈥
最终memcached是在内存存储中,就像在PHP数组中存储值一样。如果memcached实例与运行代码的服务器位于同一服务器上,那么我肯定会说使用memcached而不是memcached和PHP数组,因为你最终只需要在机器上使用〜两倍的内存。将相同的数据存储在内存中两次。
如果memcached是在单独的基础设施上(很可能),那么我想我会考虑为用户存储的数据大小。如果它很大并且您可能在PHP阵列中存储大量用户,则意味着您可能会在Web服务器上吸收的内存超出您的预期,在这种情况下,重复访问memcached中的数据,同时略微总体访问时间较慢,可能会在服务器负载下提供显着的应用程序性能。
就个人而言,我可能倾向于依赖每个请求的memcached,因为它只是更具可扩展性。
科林克,我想对迈克提出另一种观点。首先,如果getUser请求的数量大约为~50 /页或甚至几百,那么存储问题就不重要了。
其次,memcached用完了进程,所以即使memcached在同一个系统上,你仍然会遇到两个usermode上下文切换 的 得到() 强> 呼叫,所以这里的关键问题是一个简单的统计问题:每页用户出现的预期数量是多少?如果这是2,那么你的本地PHP缓存将是与memcached相关的上下文切换数量的一半。
但是,通过使用memcached可以实现真正的节省 多得 功能 - 如果你打电话,PHP memcache扩展使用它 的 内存缓存::得到() 强> 带有一系列值。但是,这需要双通算法和代码的一些更改。安全地执行此操作的一种方法是根据您的第二个示例使用本地缓存的getUser(),但添加页面结构的第0次扫描以检测推定的memcache获取目标,执行唯一排序,然后使用基于此列表的多次获取。
主线仍然可以使用缓存的get和fault返回到D / B以在memcache中设置user-XXX,但是这样一个高(例如95%)的用户查询将满足于单个进程外调用memcached。
是的,增加了一些复杂性,但我认为性能红利使其值得尝试。