13

目前我只知道两种缓存数据的方法(我使用 PHP,但我认为这同样适用于大多数语言)。

  1. 将缓存保存到文件
  2. 将缓存保存到大型数据库字段

有没有其他(也许更好)的缓存方式,还是真的就这么简单?

4

4 回答 4

2

也许您想更准确地明确您想要缓存的内容。您有所有这些机会进行缓存:

  • 访问缓存数据的数据库,首先正确调整 RDBMS,然后使用层来委派决定检测相同数据的多个查询(例如使用AdoDB。)
  • 从代码中的循环中提取计算,这样您就不会多次计算相同的值。这是您的第三种方式:将结果存储在用户的会话中。
  • 使用APC Cache之类的扩展预编译 PHP 代码。这样您就不必为每个请求编译相同的 PHP 代码。
  • 发送给用户的页面,确保您设置了正确的 META 标签(为世界做一件好事,至少绝对必要不要使用 ETL);或者可能使动态页面完全静态(具有生成 .html 页面的批处理);或使用像Squid这样的代理缓存。
  • 预取,通过这种方式,我指的是你必须通过在用户不看你的方式时做事来改善用户体验的所有机会。例如,在 HTML 文件中预加载 IMG 标记、调整 RDBMS 以进行预校、预计算结果将复杂计算存储在数据库中等。

根据我的经验,我敢打赌,在我们开始讨论缓存之前,您的代码可以改进很多。例如,考虑一下您网站的导航结构有多好以及您对用户体验的控制有多好。然后使用XDebug 之类的工具检查您的代码。

还要验证您进行 SQL 查询的情况以及索引表的情况。然后再次检查您的代码以寻找机会应用规则“多次阅读但只写一次”

使用像YSlow这样的简单工具来提示其他需要改进的简单事情。再次检查您的代码,寻找将逻辑放入浏览器的机会(通过 JavaScript)

于 2008-08-07T00:46:58.467 回答
1

您还可以缓存在内存中,效率更高。试试memcached

于 2008-08-06T22:23:13.203 回答
0

借调 memcached,把简单的东西做得很好,如果你也需要它,可以去分发和所有爵士乐

于 2008-08-07T00:48:53.300 回答
0

如果您使用的是 Apache,则可以使用 mod_rewrite 静态缓存您的网页。假设您正在使用 PHP,并且您有一个对“/somepage.php”的请求。在您的 .htaccess 文件中,您输入以下内容:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^$ # let's not cache urls with queries
RewriteCond %{REQUEST_METHOD} ^GET$ # or POST/PUT/DELETE requests
RewriteCond static_cache/%{REQUEST_URI} -s # Check that this file exists and is > 0 bytes
RewriteRule (^.*$) static_cache$1 [L] # If all the conditions are met, we rewrite this request to hit the static cache instead

如果您的缓存变为空,则该请求将照常由您的 php 脚本处理,因此现在只需让您的 php 脚本将生成的 html 存储在缓存中即可。最简单的方法是使用另一个 htaccess 规则在所有 php 请求前添加几个 php 文件(这可能是一个好主意,也可能不是一个好主意,具体取决于您的应用程序):

php_value auto_prepend_file "pre_cache.php"
php_value auto_append_file "post_cache.php"

然后你会做这样的事情:

pre_cache.php:

ob_start();

post_cache.php:

$result = ob_get_flush();
if(!$_SERVER['QUERY_STRING']) { # Again, we're not caching query string requests
  file_put_contents("static_cache/" + __FILE__, $result);
}

使用 .htaccess 文件中的一些额外的正则表达式,我们可能也可以开始缓存查询字符串请求,但我将把它作为练习留给读者:)

于 2008-09-15T21:28:30.150 回答