2

PHP でデータベース クラスを作成していて、クエリの結果を連想配列にキャッシュしたいのですが、sql ステートメントをキャッシュ配列のインデックスとして使用することをお勧めします。または、SQLのmd5を使用する必要がありますか?

class DB{
const HOST = 'localhost'; //Your Database Host!
const USER = 'user'; //Your Database Username!
const PASSWORD = 'pass'; //Your Database Password!
const DATABASE = 'database'; //Your Database Name!

private static $Instance;
private static $cache = array();

private function __construct(){
    self::$Instance = mysql_connect(self::HOST, self::USER, self::PASSWORD) or die("Could not connect to database server<br/><b>Error:</b>".mysql_error());
    mysql_select_db(self::DATABASE) or die("Could not connect to database<br/><b>Error:</b>".mysql_error());
    return self::$Instance;
}

public static function DB(){
    if(!isset(self::$Instance)){
      $c = __CLASS__; 
      new $c(); 
    }
    return self::$Instance;
}

public static function QueryUnique($query){
    $query = "$query LIMIT 1";
    //$h = md5($query);
    $h = $query;
    if(isset(self::$cache[$h]))return self::$cache[$h];

    $result = mysql_query($query, self::DB());
    self::$cache[$h] = mysql_fetch_array($result);
    return self::$cache[$h];
}

}

良い一日

4

5 に答える 5

3

実装について詳しく説明する前に、 mysql が独自のクエリ キャッシュを実行し、実装よりもいくつかの大きな利点があることを知っておく必要があります。

  • キャッシュは、すべてのPHP リクエスト間で共有されます。
  • テーブル データが変更されると、キャッシュされた結果は自動的にクリーンアップされます。
  • キャッシュは特定のメモリ サイズに制限されています (ほとんど使用されないクエリはキャッシュから削除されます)。
于 2009-08-25T04:59:02.547 に答える
1

mysqlデータのキャッシュは少し危険かもしれません、それは物事について多くの仮定をします、しかしsql文字列のmd5チェックサムはあなたのキャッシュデータのIDを生成する良い方法であると言っています、しかしあなたは正規化する必要があります最初にsql、たとえば:

'select 1+2'
'select 1 + 2'
' select 1 +2'

それぞれが異なるチェックサムを提供します。同じクエリ間のわずかな違いが処理されていることを確認する必要があります。

于 2009-08-25T04:46:36.627 に答える
1

少し余分なメモリ使用量を除けば、大きな影響はないはずですが、クエリの結果と比較すると、問題になるとは思いません。

連想配列は順序付けられたマップであるため、適切なインデックスを見つけることは、文字列の全長にあまり影響されないはずです。唯一の欠点は、ほとんどの文字列がまったく同じテキストで始まることです。

クエリにMD5ハッシュだけに依存することはありません。ハッシュの衝突が発生する可能性があり(可能性は低いですが)、まったく異なるクエリ結果が選択されます。ただし、アプリケーションにとって許容できるリスクである可能性があります。

個人的には、クエリレベルではこれをまったく行いません。キャッシュ可能性は通常、返されるデータのタイプによって異なります。このレベルでキャッシュする場合、アプリケーションはキャッシュ対象を完全に認識しません。

于 2009-08-25T04:47:24.330 に答える
0

クエリが非常に長い場合は、ある種のハッシュ(md5など)を使用します。

  • おそらく少し少ないメモリを使用します(それほど関連性はないと思います)
  • これにより、インデックスを変更せずに、ファイル、APC、memcachedなどの他の種類のキャッシュに保存できます。

md5との衝突のリスクが低いことを考えると、それを行うことは「危険」ではないようです。

var_dump私が見る唯一の問題は、デバッグ時にキャッシュされたデータを見つけるのが難しくなる可能性があることです。

于 2009-08-25T04:47:05.097 に答える
0

ハッシュ (md5、sha1) は、より少ないメモリ スペースを消費します。

于 2009-08-25T04:45:20.217 に答える