标 题 | 时 间 |
---|---|
代码之道 — 从工程项目全局的角度考虑整个项目的组织和管理 | 04:47 |
代码之道 — 项目的前期准备工作 | 11:30 |
一个好的后台系统可以极大的简化项目的开发和项目维护 | 15:25 |
代码之道 — 兵马未动,测试数据先行,重新生成测试数据 | 07:44 |
代码之道 — 快速构建用于演示的博客前台 | 15:41 |
代码之道 — 解决数据库查询的 N+1 查询浪费问题 | 06:19 |
代码之道 — 逐步构建完善的数据缓存系统 | 09:50 |
缓存之道 — 最简单粗暴的缓存机制如何实现 | 18:34 |
缓存之道 — Stay hungry ,Stay foolish,谦逊是美德 | 08:01 |
缓存之道 — 将用户缓存进行更灵活的单独管理 | 08:37 |
缓存之道 — 将评论缓存进行整体粗粒度切割 | 07:28 |
缓存之道 — 中心化的管理方式会让维护和开发变得更简单 | 02:18 |
缓存之道 — 更新单个评论时如何对缓存进行高效处理 | 05:39 |
缓存之道 — 发布新评论、删除评论时如何高效对缓存数据处理 | 05:29 |
缓存之道 — 理解读写分离的切勿僵化,缓存系统继续出发 | 04:18 |
缓存之道 — 博客总览页面分页缓存机制最简单粗暴的实现方式 | 07:59 |
缓存之道 — 分页数据缓存机制大改造 | 05:27 |
缓存之道 — 创建自己的分页器 | 06:08 |
缓存之道 — 使用 Bootstrap4 完成分页器的美化和高亮功能 | 06:23 |
缓存之道 — 创建新的博客时如何对缓存数据进行处理 | 07:29 |
缓存之道 — 更新和删除博客时如何对缓存进行操作 | 05:49 |
缓存之道 — 实现所有Model类都可以使用的抽象缓存接口 | 13:26 |
缓存之道 — 实现适用于所有Model类的抽象缓存的分页器 | 07:22 |
标 题 |
---|
一直在等这一课。我的项目正是要频繁操作更新数据的那种。
下一个视频是发布新评论和删除评论的逻辑,估计现在我不讲,你也有思路了
站长,有个关于 Observer 的问题困扰了很久,想请教下。
场景: 当用户评论完文章时,文章对应的评论量 +1。
代码实现: 在 CommentObserver 文件内的 created 方法内更新 Posts 表的 comment_counts字段。
疑惑: 类似于这样的场景,在阅读一些别人的代码时,代码中并没有添加 MySQL 事物。 当 Post 表更新失败时,评论数据生成了,文章评论量却没增加,就会出现问题啊。虽然出现这种问题的概率比较小。 平时自己在编码时,超过一张表的数据操作都会加上事物,以此保证数据不被破坏。但是看了一些教程,都没有添加事物,导致自己有些迷茫。 恰巧站长的这个教程也使用了 Observer,所以想请教下站长的做法以及看法。
哈哈,这个完全不用纠结,因为这并不是核心需要保护的业务流,所以压根不需要使用事物来进行现场的保护和回滚,这个数据是否绝对准确也并不影响业务,除非业务场景中这是一个核心评判信息,如果是核心信息的话,通过统计针对这篇文章的comment对象的数量就可以得出准确数字,这个数字不管是保存在缓存中还是像你一样保存在一个专门的字段中都没什么关系。事务很好用,但是也是有机器消耗成本的,不必要的地方尽量不要消耗mysql的计算资源,哪怕统计数字不准确,咱们不是还有其他的矫正方法吗,所以完全不用困扰。
谢谢站长解惑,通过站长的话,自己对数据与业务之间的关系也有了新的认识,再次感谢。
老师,您好!
我对这里还是不解。
$target = $comments->find($commnet->id);
$target->body = $comment->body;
为什么这样赋值后$comments对应模型的Attributes会更改呢
感觉($target取出的模型地址是不是跟$comments里对应的模型地址是一个地方,这是为什么呢?)
您能否抽时间答疑下呢,或有相关文章,让我能学习下呢。
$target 取出来的模型是保存在缓存系统中的数据,单单通过下面的赋值语句并没有修改缓存中的数据:
$target->body = $comment->body;
这只是修改了内存中的数据,需要重新生成一下缓存才行
谢谢,老师,脑子傻掉了,忘记$comments是从缓存读取的,一直理解成又重新读取的数据
叫我站长就行了,我从来没把自己当在线教育的从业者,我只是一个分享者
我也是这里没有搞明白,在$target = $comments->find($commnet->id);里面, 这个find函数返回的是单个comment对象,而传给cacheComments()的是comments集合,$target->body = $comment->body;这条语句也没有改变这个comments集合里面的数据,为什么把comments传过去,就能改变缓存里面的数据?
你得好好想想了,咱们想在操作的是缓存中的数据,不是数据库中的数据,对数据持久化的方式是不同的
刚才找到了原因,在PHP中,基本类型变量放在栈中,对象、数组放在堆中,关于对象的赋值,默认使用引用传参。这点和js是一样的。comments是集合对象,所以$target是引用,修改之后也就是修改comments集合中的数据,
不少基础不太扎实的人都会在这里卡住的,理清思路后编程的乐趣就慢慢出来了。