我即将实现一个memcached类,可以通过我们的数据库类进行扩展。但是,我已经考虑过许多不同的方法。
我的第一个问题是,Memcached::set()
中有什么意义,因为它似乎取代了密钥的价值。这不会破坏缓存结果的目的吗?
我的第二个问题是,从技术上讲,每次执行查询时,如果不检查结果,更新密钥值的最快/最佳方法是什么。如果发生这种情况,则必须不断检查结果,因此结果将不断连接到mysql数据库,因此缓存没有意义。
最后,创建密钥的最佳方法是什么?大多数人建议使用MD5,但无论如何在PDO查询中使用MD5都是一样的。
即
$key = MD5("SELECT * FROM test WHERE category=?");
该类别可以产生许多不同的结果,但密钥将不断被替换。这是最好的做法吗?
答案 0 :(得分:0)
在必须读取数据库时设置缓存条目,以便下次不必先读取数据库。您将检查缓存,如果它不存在,或者以其他方式过期,那么您将回退到数据库读取,并重置密钥。
至于密钥名称,它在很大程度上取决于类别的预期值。如果if是一个简单的整数或字符串,我会使用test.category:99
或test.category:car
之类的密钥。如果它可能更多,那么对它进行编码可能是有用的,因此它中没有空格(比如,urlencode)。
最后,如果它比那更复杂 - test:category:{MD5(category)}
。
由于密钥只是对数据的引用,并且您永远不会在任何类型的SQL查询中使用它,因此将值放在那里通常不会成为安全问题。
由于您控制何时设置缓存,如果更改了基础数据库条目,则同时使用新数据更新缓存也很简单 - 您只需使用相同的密钥。