ThinkPhp5数据库缓存分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 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内容要和上面一样才会被跟更新。


如果查询是通过主键查询,更新也是通过主键来更新,缓存也是可以被删除的。在实际的时候,查询是有很多条件的,这个时候使用数据库缓存的方式就不利于我们更新数据。不过,适用场景还是有的。比如查询文章的时候使用数据库缓存还是很方便的

猜你喜欢

转载自blog.csdn.net/HobHunter/article/details/77054007