2

アプリケーションのすべてのmysql接続を管理するデータベースクラスがあります。

いくつかの理由から、私は(遅ればせながら)Memcacheを実装する必要があります。私はそれを理解し始めましたが、1つのことを確認したいと思います。

タイムアウト時にデフォルトでクラスを修正したいと思っていました。memcacheにあるかどうかを確認し、ない場合はクエリを作成して保存します。

ただし、mysqliの結果を(この質問を介して)保存できないように見えます。それは、$ db-> fetch_assoc()または他の一般的なオブジェクトが使用するというアプリケーションでコードを使用できないことを意味しますか?

もしそうなら、これは私たちが全面的にコードの変更を一から話していることを意味しますか?頭を抱える前に確認したい。

4

3 に答える 3

6

結果オブジェクトを格納することはできませんが、すべての行を配列にフェッチしてその配列を格納することはできます。他の場所でコードのリファクタリングが必要かどうかは、コードをどのように記述したか、および以前にデータベースアクセスをどれだけうまく抽象化したかによって異なります。

たとえば、次のような関数がある場合:

function database_result($query) {
   ...
   $result_array = $result->fetchAll();
   return $result_array;
}

次に、その関数内にMemcachedキャッシングを追加できます。

function database_result($query, $expire = 60) {
   $memcached_key = 'db:' . $query;
   $cached = $memcached->get($memcached_key);
   if ($memcached->getResultCode() !== Memcached::RES_NOTFOUND) {
       return $cached;
   }
   ...
   $result_array = $result->fetchAll();
   $memcached->set($memcached_key, $result_array, $expire);
   return $result_array;
}

生のPDOまたはMySQLiオブジェクトをどこでも使用する場合は、さらに多くの作業が必要になります。

于 2012-06-20T17:03:52.267 に答える
5

Memcacheは、構造ではなく文字列を保存します。構造体を文字列としてシリアル化して格納し、逆シリアル化して構造体に戻して取得できる必要があります。

PHPはこれを行うための一連の関数を提供しているため、これは思ったよりも簡単です。参照: http: //php.net/manual/en/function.serialize.php

ただし、原則として、結果をキャッシュするときは、結果をキャッシュする前に、結果に対してできるだけ多くの処理、フィルタリング、およびその他の操作を実行する必要があります。そうすれば、キャッシュからデータを取得するときに、直後に常に同じ処理ステップを繰り返す必要はありません。

また、MySQLにはすでにクエリキャッシュが組み込まれていることにも注意してください。クエリ文字列に基づいてクエリ結果を盲目的に保存するだけの場合は、機能を複製しているだけです。パフォーマンスを大幅に向上させたい場合は、アプリケーションに関する知識を活用して、データベースクエリの結果よりも高いレベルでアプリケーションオブジェクトをキャッシュし、どこかに「付加価値」を与える必要があります。

于 2012-06-20T17:26:39.647 に答える
3

リソースに依存するものをmemcacheに保存することはできません。

memcachedであるかどうかに関係なく、ページが終了するとリソースは削除されます。mysqliの結果はオブジェクトですが、処理するリソースに依存しています。リソースを参照するためのクリーンなOOPメソッドを提供し、そのオブジェクトはおそらくmemcacheに格納できますが、ページが終了するとリソース識別子は削除されます...

mysql(i)データをmemcacheに保存する唯一の方法は、それをループして配列に入れることです。スカラーデータまたはオブジェクトデータは何も変更せず、mysqliの結果ではなくそのデータの配列を保存します。

幸運を

于 2012-06-20T17:23:34.310 に答える