我应该避免建立MySQL连接(在使用Memcache时)还是无论如何都要建立连接?
所以我刚刚开始使用Memcache。我已经准备好编写一些代码,但是我有一个优化问题: 我想知道我是否应该尽可能延迟建立MySQL连接(当所有东西都可以从Memcache中读取时,可能根本不建立MySQL连接),或者无论如何建立MySQL连接来节省我的编码时间,因为我认为不是连接而是实际的查询让我的服务器的CPU变得疯狂 因此,我必须在这两个代码示例中进行选择: 1-无论如何都要连接到MySQL 2-需要时立即连接到MySQL我应该避免建立MySQL连接(在使用Memcache时)还是无论如何都要建立连接?,mysql,optimization,memcached,Mysql,Optimization,Memcached,所以我刚刚开始使用Memcache。我已经准备好编写一些代码,但是我有一个优化问题: 我想知道我是否应该尽可能延迟建立MySQL连接(当所有东西都可以从Memcache中读取时,可能根本不建立MySQL连接),或者无论如何建立MySQL连接来节省我的编码时间,因为我认为不是连接而是实际的查询让我的服务器的CPU变得疯狂 因此,我必须在这两个代码示例中进行选择: 1-无论如何都要连接到MySQL 2-需要时立即连接到MySQL 方法是只在需要的时候连接mySQL(和其他东西)。这样可以减少应用程序
方法是只在需要的时候连接mySQL(和其他东西)。这样可以减少应用程序所需的资源(在这种情况下是网络连接)。并且您不需要向DB服务器加载
一般经验法则:仅在需要时使用资源。如果速度很重要,请提前建立连接。这不是一个开放的大资源,但它可能需要一段时间来建立 另外,通过早期连接,您可以在应用程序启动时知道是否存在问题(如数据库服务器关闭),并确认一切正常,而不是在一段时间后泄漏,因为您本可以在问题出现之前就知道并修复问题 您可能希望进一步运行heartbeat查询,以断言数据库仍然存在,原因非常相似
请注意,这种方法使数据库需要启动才能启动应用程序。你可以在两者之间做一些事情:在启动时获得连接,但如果连接不可用,就退回到即时方法,这会给你更多的灵活性。这就是我要做的。我认为这取决于并发性。但将连接缓存在线程安全池中更好 在许多web应用程序中,建立数据库连接并将其放入线程安全池中,因为建立连接的成本很高
似乎从memcached而不是直接从数据库获取数据,因为它速度更快,可以容纳这么多线程 看看你提供的代码(通常是上世纪风格的意大利面),我会投第一个票。
添加到程序流中的任何逻辑都会使代码复杂度增加十倍。所以,最好让它尽可能简单 或者,我甚至建议不要使用memcache,直到您学会如何分离和封装不同的内容。
特别是因为没有必要缓存可以通过主键从db获取的数据 这种效果并不理想,如果您将数据存储在memcache中,您将至少能够提供站点的只读版本(假设您大部分都有读取),并且只有在完成写入时才会显示错误,这是更可取的。至于站点启动,您应该对服务器进行某种监控。
$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);
}
}