为什么缓存好像没有起作用?

有一个接口,返回的是所有课程列表,关联了2个子表,一共也只有128条数据,为什么我用了缓存之后,请求接口的耗时还是和不使用缓存差不多,比如直接查询是800毫秒,直接从缓存里取也还是800毫秒,而且能明显看到请求接口时cpu的波动,缓存是正常取到值的

代码如下:
public function getList()
{
try {
// $data = Course::with([‘lecturer’, ‘department’])->where(‘status’, 1)->get();
$data = Cache::rememberForever(‘courses’, function () {
return Course::with([‘lecturer’, ‘department’])->where(‘status’, 1)->get();
});
$res = [
“code” => “00”,
“data” => $data
];
return response()->json($res);

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

楼上已经把原因整理的差不多了,还有一条可以注意,那就是缓存的是对象,取出来的时候会重新实例化,可以尝试吧get的数据转为数组在缓存,这样会快一些,理论上一百多条数据读不读数据库影响不大~

6个月前 评论
西部荒野 (楼主) 6个月前
Imuyu (作者) 6个月前
西部荒野 (楼主) 6个月前
讨论数量: 31

会不会这个响应时间和数据库快慢没有关系,800毫秒才多久。100来条数据全表扫也就一瞬间的事

6个月前 评论
西部荒野 (楼主) 6个月前
GeorgeKing 6个月前
西部荒野 (楼主) 6个月前
GeorgeKing 6个月前
chowjiawei 6个月前

数据量太小,缓存用文件感受不大的,换成redis看下

6个月前 评论
西部荒野 (楼主) 6个月前
西部荒野 (楼主) 6个月前
chowjiawei

代码贴出来 800ms太久了 按理没有走到缓存 走缓存 几十ms差不多

6个月前 评论
西部荒野 (楼主) 6个月前
PHP布道者 6个月前
chowjiawei (作者) 6个月前
chowjiawei (作者) 6个月前
chowjiawei

缓存驱动是什么 file? or redis?

6个月前 评论
西部荒野 (楼主) 6个月前

压测还是用jemeter吧 ab差太远

6个月前 评论

可以从以下几个方面排查下原因:

  1. 判断是否是初次加载缓存。缓存中没有数据时,会先从数据库查询,然后存到缓存中;
  2. 判断缓存配置是否正确。可以使用基本的 Cache::put()Cache::get() 看缓存是否可以正常使用;
  3. 开启 Laravel SQL 记录功能,通过跟踪 SQL 日志,判断是否走了 MySQL 查询;
  4. 如果配置的是 Redis 缓存驱动,可以通过 MONITOR 命令监控是否走了 Redis 查询。

希望可以帮到你~

6个月前 评论

file ,这是4核8G服务器没开opcache ,路由输出hello word时间,几十毫秒应该是本地开启opcache,然后没有网络开销的情况下吧,不然也太快了。

6个月前 评论
chowjiawei 6个月前
西部荒野 (楼主) 6个月前
chowjiawei

file

去除中间件和业务的服务等 我之前新框架可以达到24ms php8 开op

6个月前 评论
chowjiawei (作者) 6个月前
ononl 6个月前
chowjiawei (作者) 6个月前

楼上已经把原因整理的差不多了,还有一条可以注意,那就是缓存的是对象,取出来的时候会重新实例化,可以尝试吧get的数据转为数组在缓存,这样会快一些,理论上一百多条数据读不读数据库影响不大~

6个月前 评论
西部荒野 (楼主) 6个月前
Imuyu (作者) 6个月前
西部荒野 (楼主) 6个月前

file 试了下,op开启不带业务能到40,快了快5-8倍。效果还是明显的@chowjiawei

6个月前 评论
chowjiawei 6个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!