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

有一个接口,返回的是所有课程列表,关联了 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 的数据转为数组在缓存,这样会快一些,理论上一百多条数据读不读数据库影响不大~

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

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

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

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

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

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

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

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

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

压测还是用 jemeter 吧 ab 差太远

8个月前 评论

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

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

希望可以帮到你~

8个月前 评论

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

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

file

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

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

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

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

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

8个月前 评论
chowjiawei 8个月前