查询缓存
最后更新于:2022-04-02 07:31:51
## 查询缓存
>[danger] 对于使用了闭包查询的情况,因为闭包不支持序列化的原因,因此目前不支持查询缓存,需要自己对查询结果数据进行缓存。
对于一些实时性不高的应用,查询缓存可以有效提高查询性能,使用`cache`方法可以完成查询缓存。
**cache**可以用于`select`、`find`、`value`和`column`方法,以及其衍生方法,使用`cache`方法后,在缓存有效期之内不会再次进行数据库查询操作,而是直接获取缓存中的数据。
下面举例说明,例如,我们对`find`方法使用`cache`方法如下:
~~~
Db::table('user')->where('id',5)->cache(true)->find();
~~~
第一次查询结果会被缓存,第二次查询相同的数据的时候就会直接返回缓存中的内容,而不需要再次进行数据库查询操作。
默认情况下, 缓存有效期是由缓存对象的默认缓存配置参数决定的,但`cache`方法可以单独指定,例如:
~~~
Db::table('user')->cache(60)->find();
~~~
表示对查询结果的缓存有效期60秒。
缓存标识由系统自动生成,但可以手动指定缓存标识:
~~~
Db::table('user')->cache('key',60)->find();
~~~
> 指定查询缓存的标识可以使得查询缓存更有效率。
指定缓存标识的一个好处是可以在外部就可以通过缓存对象直接获取查询缓存的数据。
`cache`方法支持设置缓存标签,例如:
~~~
Db::table('user')->cache('key',60,'tagName')->find();
~~~
## 缓存自动更新
缓存自动更新是指一旦数据更新或者删除后会自动清理缓存(下次获取的时候会自动重新缓存)。
当你删除或者更新数据的时候,可以调用相同`key`的`cache`方法,会自动更新(清除)缓存,例如:
~~~
Db::table('user')->cache('user_data')->select([1,3,5]);
Db::table('user')->cache('user_data')->update(['id'=>1,'name'=>'thinkphp']);
Db::table('user')->cache('user_data')->select([1,3,5]);
~~~
最后查询的数据不会受第一条查询缓存的影响,确保查询和更新或者删除使用相同的缓存标识才能自动清除缓存。
如果使用主键进行查询和更新(或者删除)的话,无需指定缓存标识会自动更新缓存
~~~
Db::table('user')->cache(true)->find(1);
Db::table('user')->cache(true)->where('id', 1)->update(['name'=>'thinkphp']);
Db::table('user')->cache(true)->find(1);
~~~
';