版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HobHunter/article/details/77054007
写项目的时候经常需要缓存,tp5框架自带了一个数据库缓存, 数据更新时自动删除缓存,不过在用的时候发现有时候数据更新了但缓存并没有删除,便查看了下tp5数据库缓存的实现方式。
缓存
假设,现在要查询一个用户,并缓存了查询结果
Db::table(‘user’)->where(‘username’,’code’)->cache()->find();
缓存不填时间会加载配置文件里的设置的时间。第一次查询结果会被缓存,第二次查询相同的数据的时候就会直接返回缓存中的内容,而不需要再次进行数据库查询操作。
更新
现在,code(id是14)用户提交数据,需要更新数据库。
Db::table(‘user’)->update([‘username’ => ‘code’, ‘id’ => 14]);
按照官方的说法是,这条数据被更新了那应该被删除才对,但是实际上缓存并没有被删除
分析
查看了一下find方法的源码
缓存的key是序列化options和bind变量后进行MD5加密得出。我们来看下这两个变量内容是什么。
options:
array(19) {
["table"] => string(8) "user"
["where"] => array(1) {
["AND"] => array(1) {
["username"] => array(2) {
[0] => string(2) "eq"
[1] => string(6) "code"
}
}
}
["cache"] => array(3) {
["key"] => bool(true)
["expire"] => NULL
["tag"] => NULL
}
["field"] => string(1) "*"
["data"] => array(0) {
}
["strict"] => bool(true)
["master"] => bool(false)
["lock"] => bool(false)
["fetch_pdo"] => bool(false)
["fetch_sql"] => bool(false)
["distinct"] => bool(false)
["join"] => string(0) ""
["union"] => string(0) ""
["group"] => string(0) ""
["having"] => string(0) ""
["limit"] => int(1)
["order"] => string(0) ""
["force"] => string(0) ""
["comment"] => string(0) ""
}
------
bind:
array(0) {
}
嗯。options打印了一大堆东西。都是一些查询设置的条件。也就是说缓存的key是根据查询条件来获得,那么,同理,数据要被更新,上面的options内容要和上面一样才会被跟更新。
如果查询是通过主键查询,更新也是通过主键来更新,缓存也是可以被删除的。在实际的时候,查询是有很多条件的,这个时候使用数据库缓存的方式就不利于我们更新数据。不过,适用场景还是有的。比如查询文章的时候使用数据库缓存还是很方便的