所以我刚开始使用Memcache。我准备编写一些代码,但是我有一个优化问题:
我想知道是否应该尽可能延迟建立MySQL Connect(并且可能根本不建立一个,当所有内容都可以从Memcache中读取时)或者建立它以便为我节省编码时间,基于这样的想法:不是连接,而是实际的查询使我的服务器的CPU变得疯狂。
所以,我必须在这两个代码示例之间进行选择:
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("MEMCACHE: Could not connect!");
$db = mysql_connect('localhost', 'user', 'password') or die ("MySQL: Could not connect!");
mysql_select_db('database');
$sql = "SELECT id FROM table LIMIT 1";
$key = md5('query'.$sql);
//lookup value in memcache
$result = $memcache->get($key);
//check if we got something back
if($result == null) {
//fetch from database
$qry = mysql_query($sql) or die(mysql_error()." : $sql");
if(mysql_num_rows($qry)> 0) {
$result = mysql_fetch_object($qry);
//store in memcache for 60 seconds
$memcache->set($key,$result,0,60);
}
}
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("MEMCACHE: Could not connect!");
$sql = "SELECT id FROM table LIMIT 1";
$key = md5('query'.$sql);
//lookup value in memcache
$result = $memcache->get($key);
//check if we got something back
if($result == null) {
if(!$db){
$db = mysql_connect('localhost', 'user', 'password') or die ("MySQL: Could not connect!");
mysql_select_db('database');
}
//fetch from database
$qry = mysql_query($sql) or die(mysql_error()." : $sql");
if(mysql_num_rows($qry)> 0) {
$result = mysql_fetch_object($qry);
//store in memcache for 60 seconds
$memcache->set($key,$result,0,60);
}
}
答案 0 :(得分:2)
要做的就是只在你需要的时候连接到mySQL(以及其他东西)。这样就可以减少应用程序在这种情况下网络连接所需的资源。并且您不会将负载加载到数据库服务器。
一般经验法则:仅在您需要时使用资源。
答案 1 :(得分:0)
如果速度很重要,请事先联系。开放并不是一个很大的资源,但建立它可能需要一段时间。
此外,通过早期连接你知道在应用程序启动时是否存在问题(例如数据库服务器关闭)并且你得到确认一切都很好,而不是在你之前已经知道并解决了问题之后的一段时间在问题出现之前。
您可能希望更进一步并运行心跳查询以声明数据库仍然存在于类似的原因。
请注意,此方法会使数据库必需为您的应用启动。您可以在两者之间执行某些操作:在启动时获取连接,但如果它不可用,则回退到即时方法,这将为您提供更大的灵活性。这就是我要做的。
答案 2 :(得分:0)
我认为这取决于并发性。但是在线程安全池中缓存连接会更好。
在许多Web应用程序中,建立数据库连接并将其放入线程安全池中,因为建立连接非常昂贵。
似乎从memcached直接从数据库获取数据,因为它更快,并且可以容纳如此多的线程。
答案 3 :(得分:0)
看看你提供的代码(通常是上个世纪风格的意大利面条),我会投票给第一个代码。
无论添加到程序流程中的逻辑是什么,都会使代码更加复杂十倍。所以,最好尽可能简单。
或者,甚至,我建议不要使用memcache,直到你学会分离和封装不同的事情。
特别是因为缓存数据没有意义,您可以通过主键从db获取。