php - 为不同的 SQL 查询提供唯一的缓存键标识符。 md5 的替代品?

标签 php mysql caching

我有这样一个函数:

function query($query)
{
    /* If query result is in cache already, pull it */
    if $cache->has(md5($query))
       return $cache->get(md5($query));

    /* Do the actual query here. mysqli_query() etc, whatever u imagine. */

    /* Set the cache with 10 minute expiration */
    $cache->set(md5($query), $queryOutput, array(10)); 
}

基本上,如果我查询 SELECT * FROM USERS,它会自动缓存 10 分钟。

我不知道 md5 是否可靠。这一次,它创建了 32 个字符的字符串,这听起来有点矫枉过正。其次,已知 md5 会在某些输入上给出与输出相同的字符串。除了 md5 之外,还有其他方法可以识别唯一的缓存键吗?两个完全不同的 SQL 查询可能会获得相同的 md5 输出并破坏网站的某些页面的可能性很小,但我应该立即预测并相应地编写代码。

还有一件事,我觉得这样使用函数被认为是不好的做法。一个新用户可能会在我的缓存之后插入到 USERS 表,但是 SELECT * FROM USERS 仍然会得到相同的 md5 输出,因此,忽略新插入的用户。他们可能会在 10 分钟内使用相同的昵称注册几次。

我是否应该将第二个参数传递给我的敏感查询,例如 query($query, 'IGNORECACHE')?这对我来说听起来不合逻辑。会有太多的事情要记住。你们如何处理此类问题?

如果您能回答我关于本案例的 md5 替代方案的第一个问题,我将不胜感激,并且非常感谢对我的第二个问题的良好使用 SQL 缓存的简短解释。

谢谢。

最佳答案

如果您担心会发生哈希冲突(即两个具有相同 md5 的查询),只需使用查询本身作为键即可:

if $cache->has($query)
    return $cache->get($query);
$cache->set($query, $queryOutput, array(10)); 

或者,您可以使用 sha1 .它返回一个较长的字符串,因此发生冲突的可能性较低。

不要担心将 32 或 40 个字节存储为缓存键,这不会显着影响您的 Web 应用程序的性能。

MySQL 也有它的 own query cache .如果您再次执行相同的查询,MySQL 将从其缓存中获取它。如果您将用户插入到用户表中,MySQL 将认识到它不能再使用缓存,但您的缓存类不是这种情况。

关于php - 为不同的 SQL 查询提供唯一的缓存键标识符。 md5 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15363745/

相关文章:

php - 通过不同的页面传递 URL 参数

mysql - 想知道如何加快 MySQL 调用速度

mysql - 如何使用 mysqladmin 创建一个 utf8 数据库

http - Varnish Via 和 X-Varnish header : are they needed in production?

caching - Wildfly infinispan Web 缓存容器的用途是什么?

php - Laravel-5 如何从存储在数据库中的模板发送电子邮件

php - Laravel 表关系获取用户列表

php - 使用 %C3 特殊字符时数据输入 mySQL 被截断

php - Magento:如果小部件参数发生变化,则从 block /整页缓存中刷新小部件

php - 拉拉维尔 5.7。减去模型实例