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

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

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

有没有其他(或许更好)的缓存方式,或者它真的只是这么简单吗?

0
你能否给这个问题一个正确的标题?例如。 “缓存数据的最佳方法是什么?”,“除文件或数据库之外,还有哪些缓存方法可用?”或类似方法。
额外 作者 Bobby Jack,

4 答案

你也可以缓存在更高效的内存中。试试 memcached

0
额外

也许你想更确切地说明你想要缓存什么。你有这些机会来缓存:

  • Accessing the Data Base where you cache the data first correctly tuning your RDBMS, then using a layer to delegate the decision to detect multiple queries for the same data (with AdoDB for example.)
  • Extracting calculations from loops in the code so you don't compute the same value multiple times. Here your third way: storing results in the session for the user.
  • Precompiling the PHP code with an extension like APC Cache. This way you don't have to compile the same PHP code for every request.
  • The page sent to the user making sure you're setting the right META tags (do a good thing for the world and don't use ETL at least absolutly necessary); or maybe making dynamic pages completely static (having a batch process that generates .html pages); or by using a proxy cache like Squid.
  • Prefetching and by this I refer all those opportunities you have to improve the user experience just by doing things while the user don't look your way. For example, preloading IMG tags in the HTML file, tunning the RDBMS for prefectching, precomputing results storing complex computations in the database, etc.

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

还要验证你的SQL查询能力以及索引表的能力。然后再次检查你的代码,寻找机会来应用规则“多次阅读,但只写一次”

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

0
额外

借调memcached,做简单的东西,可以分配和所有爵士乐,如果你也需要它

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文件中增加一些额外的正则表达式,我们也可能开始缓存查询字符串请求,但是我会把它作为读者的练习:)

0
额外