ThinkPhp5数据库缓存分析

本文探讨了TP5框架中的数据库缓存实现机制及其局限性。重点分析了缓存键的生成过程,以及数据更新时缓存未能自动清除的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写项目的时候经常需要缓存,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内容要和上面一样才会被跟更新。


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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值