我有这样一个函数:
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/