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

时间:2020-03-05 18:38:10  来源:igfitidea点击:

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

  • 将缓存保存到文件
  • 将缓存保存到大数据库字段

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

解决方案

回答

我们还可以缓存在内存中,效率更高。尝试使用memcached。

回答

也许我们想更精确地明确要缓存的内容。我们有所有这些机会可以缓存:

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

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

还要验证我们进行SQL查询的性能以及对表进行索引的性能。然后再次检查代码,以寻找机会应用规则"多次读取但仅写入一次"

使用类似YSlow的简单工具来提示其他简单的事情以进行改进。再次检查代码,寻找机会在浏览器中放置逻辑(通过JavaScript)

回答

其次,使用memcached可以很好地完成简单的工作,并且如果需要的话,还可以进行分布式和所有爵士乐

回答

如果我们使用的是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 [L] # If all the conditions are met, we rewrite this request to hit the static cache instead

如果缓存变成空的,则该请求将照常由php脚本处理,因此现在只需将php脚本存储在缓存中即可。最简单的方法是使用另一个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文件中添加一些其他正则表达式,我们可能也可以开始缓存查询字符串请求,但我将其留给读者练习:)