15

On News Website, I have an Article model, and I want to cache the latest articles since I expect they have the highest hits. How can I write a method that operates in this way:

public function findById($id)
{
    if(Article::inMemory($id))
        return Article::findFromMemory($id);

    return Article::find($id);
}

If there are any better approaches, please mention them as well

1

2 Answers 2

4

Laravel has a feature explicitly for this scenario, called Retrieve Or Update:

use Cache;
public function findById($id)
{
    return Cache::rememberForever("article-$id", function () use ($id) {
        return Article::find($id);
    });
}

This will cache and return the closure's returned value, otherwise executing the closure to populate the cache if needed.

Sign up to request clarification or add additional context in comments.

Comments

3
use Cache;
public function findById($id) 
{
    if ($articleInCache = Cache::get('article-' . $id)) {
        return $articleInCache;
    }
    return Article::find($id);
}

There are multiple memory drivers you can use and you can determine how you want to store the values in memory. Above, it assumes you stored the value with the 'article-' . $id (such as "article-5" as the key). It's up to you.

Check out the docs: https://laravel.com/docs/master/cache

Check out Laracasts: https://laracasts.com/series/real-time-laravel-with-socket-io/episodes/2

1 Comment

You should also add the article to the cache if its not currently in there

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.