1

そのため、Memcache を使い始めたばかりです。コードを書く準備はできていますが、最適化に関する質問があります。

MySQL Connect の確立を可能な限り遅らせるべきか (Memcache からすべてを読み取ることができる場合は、まったく確立しない可能性があります)、それとも接続を確立しないという考えに基づいて、コーディング時間を節約するために接続を確立する必要があるのか​​ 疑問に思います。しかし、実際のクエリはサーバーの CPU を狂わせます。

したがって、次の 2 つのコード例のどちらかを選択する必要があります。

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 (およびその他のもの) に接続することです。そうすれば、この場合のネットワーク接続でアプリが必要とするリソースを削減できます。DBサーバーに負荷をかけません。

一般的な経験則 : リソースは必要な場合にのみ使用してください。

于 2012-12-23T13:43:36.403 に答える
0

速度が重要な場合は、接続を前もって行ってください。オープンにすることは大きなリソースではありませんが、確立するのに時間がかかる場合があります。

また、早期に接続することで、アプリの起動時に問題があるかどうか(データベースサーバーのダウンなど)がわかり、以前に知っていて問題を修正する前に問題を修正できたときに、しばらくしてから滲み出るのではなく、すべてが順調に進んでいることを確認できます。 becmeの問題。

さらに進んでハートビートクエリを実行し、データベースがまだそこにあることを主張することもできます。同様の理由です。

このアプローチでは、アプリを起動するためにデータベースを起動する必要があることに注意してください。その間に何かを行うことができます。起動時に接続を取得しますが、接続が利用できない場合は、ジャストインタイムアプローチにフォールバックします。これにより、柔軟性が向上します。これが私がすることです。

于 2012-12-23T13:52:58.560 に答える
0

並行性によると思います。ただし、スレッドセーフプールに接続をキャッシュする方が優れています。

多くの Web アプリケーションでは、接続の確立にはコストがかかるため、データベース接続が確立され、スレッド セーフ プールに入れられます。

より高速で非常に多くのスレッドを保持できるため、データベースから直接ではなく memcached からデータを取得するようです。

于 2012-12-23T14:33:32.127 に答える
0

あなたが提供したコード (通常の前世紀スタイルのスパゲッティ) を見ると、最初のコードに投票します。
プログラム フローにどのようなロジックを追加しても、コードは 10 倍も複雑になります。したがって、できるだけ単純なままにしておくことをお勧めします。

あるいは、さまざまな事柄を分離してカプセル化する方法を学ぶまでは、memcache をまったく使用しないことをお勧めします。
特に、主キーによって db から取得できるデータをキャッシュする意味がないためです。

于 2012-12-23T14:44:08.330 に答える