【问题标题】:Frequent updates on cached data laravel缓存数据的频繁更新 laravel
【发布时间】:2017-04-29 09:08:31
【问题描述】:

我目前正在使用 laravel 内置的 redis 缓存来缓存帖子。但是我在缓存帖子时遇到了问题。我基本上在帖子表中有一个名为 score 的列,每当用户赞成/反对时,它就会更新,问题是如果用户赞成或反对缓存的帖子,则分数列在 10 分钟过去后才会更新(这是多少分钟直到使用 laravel 内置的 Cache::remember 函数缓存更改。解决这个问题的最佳方法是什么?这是我的意思的代码示例

public function home(Request $request)
    {
        //Get posts that have high scores and in the last 7 days..
//       $posts = Post::with('user')->orderBy('score','desc')->whereRaw('created_at >= now() - INTERVAL 7 DAY')->paginate(30);
       $page = $request->has('page') ? $request->query('page') : 1;
       //$posts = Post::with('user')->orderBy('score','desc')->paginate(50); 
      $posts = Cache::remember('posts' . $page, 10, function(){
      return Post::with('user')->orderBy('score','desc')->paginate(1);
});
       return view('posts.home', compact('posts','page'));
    }

一切正常,帖子被缓存,当用户赞成/反对时,问题就会出现。分数列不更新

【问题讨论】:

  • 让 upvote/downvote 端点使相关缓存项无效。您甚至可以通过模型上的事件来执行此操作,因此每当模型更改相关缓存时,总是会自动清除。

标签: php laravel caching


【解决方案1】:

TL;DR - 不要缓存经常更新的内容(尤其是在您进行分页排序时)。重新查询您的数据库并使用索引以获得性能。

但是,如果您仍然想追求自己的方法... score 应该在数据库中更新,但是您会从缓存中获取所谓的 stale 数据。更新分数时可能需要Cache::forget('posts' . $page);(我建议使用事件),因此无论何时更新分数,您都会查询最新数据。

【讨论】:

    猜你喜欢
    • 2014-11-14
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2011-10-06
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多