1

所以我才刚刚开始使用 Memcache。我准备写一些代码,但是我有一个优化问题:

我想知道我是否应该尽可能延迟建立 MySQL Connect(也许根本不建立一个,当所有内容都可以从 Memcache 读取时)或者建立它以节省我的编码时间,基于不是连接的想法但是实际的查询让我的服务器的 CPU 发疯了。

所以,我必须在这两个代码示例之间进行选择:

1 - 仍然连接到 MySQL

$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);
   }
}

2 - 在需要时立即连接到 MySQL

$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);
   }
}
4

4 回答 4

2

可行的方法是仅在需要时才连接到 mySQL(和其他东西)。在这种情况下,您可以减少应用程序在网络连接中所需的资源。并且您不会对数据库服务器施加负载。

一般经验法则:仅在需要时使用资源。

于 2012-12-23T13:43:36.403 回答
0

如果速度很重要,请提前连接。开放的资源不是很大,但可能需要一段时间才能建立起来。

此外,通过尽早连接,您可以在应用程序启动时知道是否存在问题(例如,数据库服务器关闭),并且您可以确认一切正常,而不是在您本可以更早知道并在问题出现之前解决问题的一段时间后才泄露出来成为问题。

您可能想更进一步并运行心跳查询以断言数据库仍然存在,原因与此类似。

请注意,这种方法使您的应用程序需要启动数据库。您可以在两者之间做一些事情:在启动时获得连接,但如果它不可用,则回退到及时方法,这会给您更大的灵活性。这就是我要做的。

于 2012-12-23T13:52:58.560 回答
0

我认为这取决于并发性。但是将连接缓存在线程安全池中会更好。

在许多 Web 应用程序中,建立数据库连接并将其放入线程安全池中,因为建立连接的成本很高。

似乎从 memcached 而不是直接从数据库中获取数据,因为它更快并且可以容纳这么多线程。

于 2012-12-23T14:33:32.127 回答
0

查看您提供的代码(通常是上世纪风格的意大利面条),我会投票给第一个。
无论添加到程序流中的任何逻辑都会使您的代码复杂十倍。所以,最好让它尽可能简单。

或者,我什至建议不要使用 memcache,直到你学会了如何分离和封装不同的事物。
特别是因为缓存数据没有意义,您可以通过主键从 db 获取数据。

于 2012-12-23T14:44:08.330 回答