使用Memcache缓存MySQL结果并对缓存结果进行排序/过滤

时间:2014-05-09 15:20:54

标签: php mysql kendo-ui memcached kendo-grid

为了帮助每个人了解我提出的问题,我提出了一个方案:

我的网络应用上有用户A.

有一个特定页面,其中包含一个表,其中包含该用户独有的信息。让我们说它是仅为用户A显示的客户列表,因为用户A和这些客户位于区域5中。

其他用户被分配到不同的区域并查看不同的客户列表。

我想要做的是缓存每个用户列表的所有结果。这不是我可以使用的问题:

    $MC = new Memcache;

    $MC->addserver('localhost');
    $data = $MC->get('customers');
    if($data)
    {

    } else {
        $data = $this->model->customersGrid($take, $skip, $page, $pageSize, $sortColumn, $sortDirection, $filterSQL, $PDOFilterParams);
        $MC->set('customers', $data);
    }
    header('Content-Type: application/json');
    return $data;

现在的挑战是以某种方式将来自我的users表的SQL过滤器语法转换为可以对数组进行过滤和排序的函数($ data是一个JSON字符串,如果那样,我将变成一个数组。正确的方式)。

仅供参考,这是我用于在语句中构建WHERE子句的别名数组:

    $KF = new KendoFilter;
    $KF->columnAliases = array(
        'theName' => 'name',
        'dimensions' => 'COALESCE((SELECT CONCAT_WS(" x ", height, width, CONCAT(length, unit)) FROM products_dimensions,
         system_prefs, units_measurement
         WHERE products_dimensions.productId = product.id
         AND units_measurement.id = system_prefs.defaultMeasurementId), "-")',
        'gridSearch' => array('theName', 'basePrice')
    );
    $filterSQL = $KF->buildFilter();

我的问题是过滤和排序内存缓存数据的好方法是什么,好像它是一个SQL查询?或者memcache有内置的东西吗?

1 个答案:

答案 0 :(得分:0)

Memcache不能这样做 - 你不能用memcache替换你的数据库(这不是它的用途),你只能存储key =>价值对。

我认为更好的方法是将每个用户的每个数据存储在特定的mem缓存密钥中。

例如,如果有$user_id = 123的用户A访问该网页:

$data = $MC->get('customers_for_'.$user_id);

这样您只能获得用户123的客户。

更通用的方法是使用它的参数为每个sql查询生成一个哈希值(但在大多数情况下这可能有点过分)。例如,如果您有一个包含变量select ... from ... where a = @a and b = @b$a的查询$b,您可以执行以下操作(当然,您必须根据剑道进行调整,但要明白这一点):

$query = "select ... from ... where a = @a and b = @b";
# crc32 because it is fast and the mem key does not get too long
$sql_crc = crc32($query.$a.$b);
$data = $MC->get("customers_".$sql_crc);

要排除(不太可能)不同用户的哈希冲突,您也可以混合密钥中的用户ID:

$data = $MC->get("customers_for_".$user_id."_".$sql_crc);

但是:如果你开始在你的应用程序中的所有位置,因为否则它太慢,那么问题可能在于你的数据库(缺少/错误的索引,错误的列定义,复杂的关系等)和时间应该更好地投资修复数据库而不是解决这个问题。