我想缓存一个使用率高且耗时久的查询应该怎么做?

最近在看缓存相关的内容,现在有点搞不懂该怎么正确的使用缓存,在什么场景使用缓存。求各位大佬指点一下。

我先举个例子:假如现在我有一个查询比较频繁而且时间比较久,我想缓存这个查询。
未添加缓存的代码:

    public function test(array $array1, array $array2)
    {
        return Table1::select('a', 'b','c')
            ->with([
                'with1' => function ($query) use($array1) {
                    $query->select('c', 'd')
                        ->join('table2', 'table2.c', '=', 'table1.c')
                        ->where($array1);
                }
            ])
            ->whereIn('a', $array2)
            ->get();
    }

下面是我写的添加了缓存的代码。这样写对不对?

public function test(array $array1, array $array2)
    {
        $str1 = implode(",", sort($array1));
        $str2 = implode(',', sort($array2));
        $test = \Cache::remember("test$str1$str2",10, function () use ($array1, $array2) {
            return Table1::select('a', 'b','c')
                ->with([
                    'with1' => function ($query) use($array1) {
                        $query->select('c', 'd')
                            ->join('table2', 'table2.c', '=', 'table1.c')
                            ->where($array1);
                    }
                ])
                ->whereIn('a', $array2)
                ->get();
        });

        return $test;
    }

像上述的情况应该怎么去缓存。还有就是应该在什么场景去使用缓存。求教....

Egfly
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 3
Egfly

求指点正确的缓存姿势

5年前 评论

大体流程上没啥问题,不过不建议拿数组作为传递的参数去处理,你缓存的数据必须是独一的,$array1$array2 作为 where 条件去处理的话可能会有异常情况出现;另外建议三表查询能分开查就分开查,最后通过程序去合并数据比 Join 要好些。
缓存场景的一般有 排行榜用户信息统计信息 等,其实这个主要看个人,觉的能用就用。
贴下我在项目中处理的方法:

file

5年前 评论
Egfly

@Jade 感谢大佬回复,其实在写的时候就是比较困惑这种参数是数组的时候应该去处理,所以就想了个歪法子把array 装成字符串当作Redis key。写完之后又感觉很奇怪 :joy:

5年前 评论

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