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

有一个接口,返回的是所有课程列表,关联了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);

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

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

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

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

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

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

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

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

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

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

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

压测还是用jemeter吧 ab差太远

1个月前 评论

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

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

希望可以帮到你~

1个月前 评论

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

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

file

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

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

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

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

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

1个月前 评论
chowjiawei 1个月前

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