Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel, using in-memory DB to cache results

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

like image 619
UX Labs Avatar asked Jan 17 '16 21:01

UX Labs


People also ask

Does Laravel cache query results?

Using cache to store query results It's as simple as it gets! Now, for the next 10 minutes, Laravel will fetch the result from the books key of the cache instead of querying the database. And this can especially improve the performance of your application when you're performing complex queries to fetch results.

How does Laravel manage cache?

Your application's cache configuration file is located at config/cache.php . In this file, you may specify which cache driver you would like to be used by default throughout your application. Laravel supports popular caching backends like Memcached, Redis, DynamoDB, and relational databases out of the box.

Where cache is stored Laravel?

Laravel provides a unified API for various caching systems. The cache configuration is located at app/config/cache. php . In this file you may specify which cache driver you would like used by default throughout your application.


2 Answers

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

like image 74
Deciple Avatar answered Sep 18 '22 07:09

Deciple


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.

like image 21
tjbp Avatar answered Sep 18 '22 07:09

tjbp