付费课程, 订阅后即可观看
代码之道 - 高效缓存
23 集视频
3小时11分钟
本期Laravel视频教程我们看一看当更新评论时,如何对评论的缓存进行处理,我们的目标就是将更新后的数据重新缓存,而不再通过数据库的查询语句查询其他评论的数据,在内存和缓存中对数据进行操作。
一直在等这一课。我的项目正是要频繁操作更新数据的那种。
下一个视频是发布新评论和删除评论的逻辑,估计现在我不讲,你也有思路了
站长,有个关于 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集合中的数据,
不少基础不太扎实的人都会在这里卡住的,理清思路后编程的乐趣就慢慢出来了。