除了文件或数据库之外,还有哪些缓存方法?

时间:2008-08-06 22:21:55

标签: language-agnostic caching

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

  1. 将缓存保存到文件
  2. 将缓存保存到大型数据库字段
  3. 还有其他(可能更好)的缓存方式还是真的这么简单?

4 个答案:

答案 0 :(得分:2)

也许您想要更准确地显示您想要缓存的内容。你有这么多机会缓存:

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

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

还要验证您的SQL查询效果如何以及您对表的索引程度如何。然后再次检查您的代码,以寻找机会应用规则“多次阅读但只写一次”

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

Seconding memcached,做得很简单,如果你也需要它可以分配和所有爵士乐

答案 3 :(得分: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规则来支持end将几个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文件中有一些额外的正则表达式,我们也可以开始缓存查询字符串请求,但我会把它作为读者的练习:)