我在 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];
}

}

再会

有帮助吗?

解决方案

在你深入实施之前,你应该知道 mysql 有自己的查询缓存 与您的实施相比,它有几个主要优点:

  • 缓存被共享 全部 PHP 请求。
  • 当表数据发生变化时,缓存的结果会自动清理。
  • 缓存限制在一定的内存大小(很少使用的查询将从缓存中删除)

其他提示

缓存MySQL的数据可能是一个有点冒险,这让很多事情的假设,不过话说回来了SQL字符串的MD5校验和是产生一个ID为缓存数据的好方法,但是你需要到第一归一化SQL,例如:

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

每个人会给出不同的校验,你需要确保相同的查询之间的任何一点差异的照顾。

不应该有一个大的影响,除了一点点额外的内存使用情况,但相对于查询的结果,我不认为这将是一个问题。

关联数组是有序的地图,所以找到正确的索引不应受串的总长度太多。唯一的缺点是,大部分的字符串开始使用完全相同的文字。

我不会依赖的只是的MD5哈希为您查询。这是可能的(如果可能)会发生哈希冲突,它会选择一个完全不同的查询结果。这可能是你的但是应用的可接受风险。

就个人而言,我不会在查询级别做到这一点的。可缓存通常取决于返回的数据类型。如果缓存在这个水平,你的应用程序将完全不可知的东西是缓存。

一个散列(MD5,SHA1)将少吃内存空间。

如果查询很长,我会选择使用某种哈希(如 md5):

  • 它可能会使用更少的内存(我想不太相关)
  • 它将允许您将其存储在其他类型的缓存中,例如文件或 APC 或 memcached 或其他任何内容,而无需更改索引。

考虑到与 md5 发生冲突的风险较低,这样做似乎并不“危险”。

我看到的唯一问题是,在调试时,您可能会更难找到缓存的数据,无论是 var_dump 或任何类型的“真正的”调试器:-(

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top