【问题标题】:Laravel keeps getting the same cache result even if I input different search keyword即使我输入不同的搜索关键字,Laravel 也会得到相同的缓存结果
【发布时间】:2020-05-06 05:03:55
【问题描述】:

我收到了一个 api 请求,其中有一个参数是 projectname。问题是,当我搜索例如 A 时,结果将是 A,但是当我搜索 B 时,即使我搜索 C,结果仍然是 A,结果仍然是相同的。我认为缓存保存了第一个搜索字符串的第一个结果。我的问题是如何保存每个搜索查询中的每个结果,而不会根据搜索查询获得相同的结果?

这是我的代码

 public function getRecordDetails(Request $request){

        if(!empty($request->limit)){
            $limit = " LIMIT ".$_REQUEST['limit'];
        }
        else{
            $limit= '';
        }

        if(empty($request->projectname)){
            dd('Field is empty');
        }
        else{

            $data = Cache::rememberForever('results', function () use($request) {
                $result =  DB::connection('mysql2')
                ->table('xp_pn_ura_transactions')
                ->whereRaw(DB::raw("CONCAT(block, ' ', street,' ',project_name,' ', postal_code,'')LIKE '%$request->projectname%' order by STR_TO_DATE(sale_date, '%d-%M-%Y') desc"))
                ->limit($request->limit)
                ->distinct()
                ->get();

                $count =  DB::connection('mysql2')
                ->table('xp_pn_ura_transactions')
                ->whereRaw(DB::raw("CONCAT(block, ' ', street,' ',project_name,' ', postal_code,'')LIKE '%$request->projectname%'"))
                ->count();


                return json_encode(array('count'=>$count,'result'=>$result));
            });

            return $data;
        }
    }

PS:这个问题是基于这里How could I cache every api response results in my query in Laravel?我在这里回答的,但根据我的回答这是不同的问题。感谢您的帮助。

【问题讨论】:

    标签: mysql laravel caching


    【解决方案1】:

    因为您一遍又一遍地使用相同的缓存块。您应该根据更改的输入更改缓存 slug。添加 $request 作为函数的 use 参数不会神奇地改变缓存 slug。

    在你的情况下,这应该有效:

    Cache::rememberForever("results_{$request->projectname}", function () use ($request) {
    

    【讨论】:

    • 好的,先生,我也试试这个。非常感谢这个
    【解决方案2】:

    Laravel 通过键找到缓存。您正在使用 results 作为您的密钥。

    因此,无论您通过的请求有多么不同。它仍然可以通过results找到缓存。

    因此它将返回您存储在results 中的第一个缓存。

    $key = "results:".$request->projectname.':' $request->limit;
    Cache::rememberForever($key, function () use ($request) {
        ...
    }
    

    这将存储您请求的每个不同的projectname

    然而

    问题一:

    用户可以请求的差异可能性非常多。 我认为存储所有这些缓存不是一个好主意。如果没有那么多也没关系。

    解决办法:

    或者您可以使用remember() 代替rememberForever()

    $ttl = ????; // Find the appropriate time to expire the cache
    $value = Cache::remember($key, $ttl, function () {});
    

    问题2:

    您的缓存中有一个$request->limit

    这意味着如果有人在该表中插入或删除记录。下次你向另一个limit请求时,你将面临重复记录。

    解决办法:

    所以我认为你可以在 createupdatedelete 记录之后清除缓存。

    【讨论】:

    • 我明白了,先生。但我的 api 中只有一个 select 语句。如果我有新记录要刮,我只会在必要时更新我的​​ api,也许每月一次。这样好吗?
    • 我认为这是合适的答案
    • @user001232 这不是一个大问题,如果你觉得你存储的缓存太多。只需设置缓存的过期时间即可。
    【解决方案3】:

    您应该在键 id 之后和之前添加文本值,例如 bello

    Cache::rememberForever('product_'.$product->id.'_key',function ()
    
    });
    

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 2014-11-28
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2022-10-13
      • 1970-01-01
      相关资源
      最近更新 更多