草庐IT

php - 选择合适的缓存机制

coder 2024-04-07 原文

我的设置:

  • 4 台网络服务器
  • 静态内容服务器(NFS 挂载)
  • 2 个数据库服务器
  • 2 个“魔术”服务器
  • 另外 8 台指定为多用途的机器。

我正在为三种缓存机制编写一个包装器,以便可以以某种规范化的方式使用它们:文件系统、Memcached 和 APC。我正在尝试提供使用示例(以及实际放入每个缓存中的内容)。

文件系统

处理我们生成然后静态提供的内容。 RSS 提要、旧报告数据、用户特定页面等...这些都缓存到静态服务器。

内存缓存

PHP session 数据、MySQL 查询结果,通常是需要在我们的系统中可用的东西。我们有 8 台机器可以包含在服务器池中。

APC

我不知道。这两个“魔术”服务器不是任何分布式系统的一部分,因此它们似乎可以在 APC 中缓存查询结果并从那里工作。除此之外,我想不出任何东西。

查询缓存

鉴于我们使用 SQL 的性质,查询缓存会降低性能。我已经禁用了它。

一般来说,什么类型的数据应该存放在哪里?这种设置有意义吗?

APC 数据缓存在分布式系统中有什么用处(我想不出一个)吗?

我是否遗漏了一些能让事情变得更简单或更高效的东西?

编辑:我终于明白帕斯卡在说什么了。我一直在想,我只会将我的配置/任何内容的一部分移动到 APC,并仍然从磁盘加载文件的其余部分。还有其他建议吗?

最佳答案

我在某些项目中使用了相同类型的缓存机制;我们使用 APC + memcached 作为缓存系统。

在缓存数据方面,APC 和 memcached 之间有两个/三个主要区别:

  • APC 访问速度稍快(如果我没记错的话,大约比 memcached 快 5 倍),因为它只是本地的——即不涉及网络。
  • 使用 APC,您的缓存会在每台服务器上复制;使用 memcached,没有跨服务器的重复
    • 这意味着 memcached 确保所有服务器都具有相同版本的数据;而存储在 APC 中的数据在每个服务器上可能不同


我们通常使用:

  • APC 用于必须经常访问的数据,可以快速生成,并且:
    • 两者都不经常修改
    • 或者如果它在所有服务器上都不相同也没关系
  • memcached 用于生成需要更多时间和/或较少使用的数据。
    • 或者对于修改必须立即可见的数据(即,当写入数据库时​​,也会重新生成缓存的条目)

例如,我们可以:

  • 使用 APC 存储配置变量:
    • 不要经常改变
    • 经常访问
    • 很小
  • 将 memcached 用于文章内容(例如,对于 CMS 应用程序):
    • 不是那么小,而且有很多,这意味着它可能需要比我们单独在一台服务器上拥有的更多的内存
    • 很难/很重地生成


一些旁注:

  • 如果多个服务器尝试写入通过 NFS 共享的同一个文件,可能会出现问题,因为 NFS 上没有锁定机制(据我所知)
  • APC 可用于缓存数据,是的——但使用它的最重要原因是它的操作码缓存功能(可以在 PHP 服务器上节省大量 CPU)
  • memcached 中的条目大小有限制:您不能存储大于 1M 的条目(我有时会遇到这个问题——很少,但一旦发生就不好了 ^^)

关于php - 选择合适的缓存机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2353008/

有关php - 选择合适的缓存机制的更多相关文章

  1. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  2. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  3. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  4. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  5. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

  6. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

  7. ruby-on-rails - ActiveAdmin 自定义选择过滤器下拉名称 - 2

    对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking

  8. python - 帮我找到合适的 ruby​​/python 解析器生成器 - 2

    我使用的第一个解析器生成器是Parse::RecDescent,它的指南/教程很棒,但它最有用的功能是它的调试工具,特别是tracing功能(通过将$RD_TRACE设置为1来激活)。我正在寻找可以帮助您调试其规则的解析器生成器。问题是,它必须用python或ruby​​编写,并且具有详细模式/跟踪模式或非常有用的调试技术。有人知道这样的解析器生成器吗?编辑:当我说调试时,我并不是指调试python或ruby​​。我指的是调试解析器生成器,查看它在每一步都在做什么,查看它正在读取的每个字符,它试图匹配的规则。希望你明白这一点。赏金编辑:要赢得赏金,请展示一个解析器生成器框架,并说明它的

  9. ruby-on-rails - 多次选择一个随机数,但绝不会两次选择相同的随机数 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIgeneratealistofnuniquerandomnumbersinRuby?我想做的事:Random.rand(0..10).timesdoputsRandom.rand(0..10)end但如果随机数已经显示过,则无法再次显示。如何最轻松地做到这一点?

  10. ruby - mixin方法名冲突时如何选择调用方法? - 2

    当你在类中包含方法名冲突的模块时,它会使用类定义的方法。有没有办法选择我想运行的?moduleBdefself.hello"helloB"endendclassAincludeBdefself.hello"helloA"endendA.hello#=>thisprints"helloA",whatifIwant"helloB"? 最佳答案 Ben,当你在Ruby中调用一个方法(比如hello)时,会发生以下情况:如果接收者的特征类有一个名为hello的方法,它将被调用。如果不是:如果接收者的类有一个名为hello的实例方法,它将被调

随机推荐