所以我才刚刚开始使用Memcache。我已经准备好写一些代码了,但是我有一个优化问题:
我想知道我是应该尽可能地推迟建立CPU连接(也许根本就不建立,因为所有的东西都可以从Memcache中读取),还是无论如何都要建立它,以节省我的编码时间,因为我认为不是连接,而是实际的查询会让我的服务器的MySQL发疯。
因此,我必须在这两个代码示例中进行选择:
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);
}
}发布于 2012-12-23 21:43:36
方法是只有在你需要的时候才连接到mySQL(和其他东西)。这样你就减少了你的应用需要的资源,在这种情况下,网络连接。并且您不会将负载放到DB服务器上。
一般经验法则:只有在需要时才使用资源。
发布于 2012-12-23 21:52:59
如果速度很重要,那就提前建立连接。这不是一个开放的大资源,但它可能需要一段时间才能建立。
此外,通过提前连接,你在应用程序启动时就知道是否有问题(例如数据库服务器宕机),并确认一切正常,而不是在一段时间之后,当你本可以更早知道问题并在问题成为问题之前解决问题时,再说出来。
您可能希望更进一步并运行心跳查询,以断言数据库仍然存在,因此原因类似。
请注意,这种方法使得数据库需要启动才能启动您的应用程序。你可以在两者之间做一些事情:在启动时获得连接,但如果它不可用,就退回到即时方法,这会给你更多的灵活性。我就会这么做。
发布于 2012-12-23 22:33:32
我认为这取决于并发性。但是在线程安全池中缓存连接更好。
在许多web应用程序中,建立数据库连接并将其放入线程安全池中,因为建立连接的成本很高。
这看起来像是从memcached中获取数据,而不是直接从数据库中获取数据,因为它更快,并且可以容纳如此多的线程。
https://stackoverflow.com/questions/14011231
复制相似问题