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


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

ThinkPhp5数据库缓存分析相关推荐

  1. 4 种数据库缓存最终一致性的优缺点对比?最终选择方案四!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 叶不闻 jjuejin.im/post/5d5c99b66fb9a ...

  2. 数据库缓存最终一致性的四种方案

    数据库缓存最终一致性的四种方案 背景 缓存是软件开发中一个非常有用的概念,数据库缓存更是在项目中必然会遇到的场景.而缓存一致性的保证,更是在面试中被反复问到,这里进行一下总结,针对不同的要求,选择恰到 ...

  3. 简述sqlite数据库的特点_为什么要用SQLITE?SQLITE数据库优点和缺点分析

    <为什么要用SQLITE?SQLITE数据库优点和缺点分析>要点: 本文介绍了为什么要用SQLITE?SQLITE数据库优点和缺点分析,希望对您有用.如果有疑问,可以联系我们. SQLIT ...

  4. 缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性

    缓存淘汰 为什么需要缓存淘汰?你需要缓存30G的数据,但是Redis本身只能使用10G的内存,那你就得做个取舍了,毕竟鱼与熊掌不可兼得.为了利益最大化肯定要保留最重要的10个G. Redis本身提供了 ...

  5. 构建高性能数据库缓存之redis主从复制

    一.什么是redis主从复制? 主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致:且实现Redis的主从复制 ...

  6. 面试老大难的数据库缓存一致性问题

    在数据库和缓存的操作过程中,可能存在"先写数据库,后删缓存"."先写数据库,后更新缓存"."先删缓存库,后写数据库"以及"先更新缓 ...

  7. 再有人问你数据库缓存一致性的问题,直接把这篇文章发给他

    在之前的一篇文章<为什么会出现数据库和缓存不一致的问题>中,我们介绍过缓存和数据库会出现数据不一致的几种情况. 我们提到过,在数据库和缓存的操作过程中,可能存在"先写数据库,后删 ...

  8. 数据库缓存一致性问题

    在数据库和缓存的操作过程中,可能存在"先写数据库,后删缓存"."先写数据库,后更新缓存"."先删缓存库,后写数据库"以及"先更新缓 ...

  9. Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)

    前 言 ?? 作者简介:,长跑型选手,立志坚持写10年博客,专注于java后端 ?? 专栏简介:mysql进阶,主要讲解mysql数据库进阶知识,包括索引.数据库调优.分库分表等 ?? 文章简介:本文 ...

最新文章

  1. PyTorch 实现 VAE 变分自编码器 含代码
  2. Tensorflow实现MNIST数据自编码(3)
  3. 把 Spring Cloud 给拆了!详解每个组件的作用
  4. 面试题7:重建二叉树
  5. 信息奥赛一本通(1099:第n小的质数)
  6. 微软MVC对架构的一点思考
  7. springmvc整合dubbo
  8. mysql主从io为no_mysql主从同步错误解决和Slave_IO_Running: NO
  9. 躺着赚钱|闲鱼自动发货脚本|自动化|Auto.js
  10. 算法时间复杂度Θ(n2)与 O(n2)
  11. 计算机网络谢希仁第七版 第五章 答案
  12. win10电脑任务栏软件图标变成白色解决办法
  13. Excel批量转置——录制会循环的宏
  14. Java/java程序设计:房屋出租系统:要求实现:新增房源,查找房屋信息,修改房屋信息,删除房屋信息,显示所有房屋列表,退出房屋管理系统;
  15. Matlab画线性规划可行域
  16. Node交互式命令行工具开发——自动化文档工具
  17. 史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)(Finchley版本)
  18. 2021年想转行产品经理,应该如何入门?
  19. 使用text-shadow 实现字体描边效果
  20. element下拉列表触发_记一次vue长列表的内存性能分析和优化

热门文章

  1. Ubuntu18.04挂载2T机械硬盘
  2. python转换js,PythonJS
  3. Linux系统关闭防火墙命令
  4. 如何选择验证码短信接口
  5. 初学软件工程——(一、二章)
  6. 一文看懂大数据的技术生态圈,Hadoop,hive,spar
  7. 3GPP R17标准延期
  8. ES6数组去重 new Set()
  9. vue3+ts引入第三方js包,避免关键字报错
  10. MathType公式统一格式化