mikebronner / laravel-model-caching

Eloquent model-caching made easy.
MIT License
2.22k stars 212 forks source link

Performance test on 3000 records #429

Closed S-Masoud-Emamian closed 2 years ago

S-Masoud-Emamian commented 2 years ago

I have a Category Model. When I extended my Category model with Model to get all records my response time with postman is: => 1400~1500 ms.

but when I want to get all my records with CachedModel my response time with postman is:: => 1500 ~ 1600 ms

My Model:

class Category extends CachedModel
{
    use HasFactory,SoftDeletes;

    protected $fillable = [
        'title',
        'parent_id',
        'status',
        'type',
        'description'
    ];
class Category extends Model
{
    use HasFactory,SoftDeletes;

    protected $fillable = [
        'title',
        'parent_id',
        'status',
        'type',
        'description'
    ];

To get all records: $model = new Category(); return response()->success($model->all(), 'success');

To config this lib:

.env: MODEL_CACHE_STORE=model

cache.php:

        'redis' => [
            'driver' => 'redis',
            'connection' => 'cache',
            'lock_connection' => 'default',
        ],
        'model' => [
            'driver' => 'redis',
            'connection' => 'model-cache',
            'lock_connection' => 'default',
        ],

database.php:

    'redis' => [

        'client' => env('REDIS_CLIENT', 'predis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        ],

        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'username' => env('REDIS_USERNAME'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
        ],
        'model-cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'username' => env('REDIS_USERNAME'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '1'),
        ],

Environment

mikebronner commented 2 years ago

Hi @S-Masoud-Emamian,

The performance of retrieving cached records is solely dependent on how the caching server is set up, which is beyond the scope of this package. You would need to identify how to improve your Redis server performance. For example, you might gain performance by setting up a dedicated reds server with faster CPUs, possibly more cores, and definitely more RAM. Understanding your preferred cache driver (redid, memcached) performance tuning is key.

If you are using the same server as your website, you will have to share RAM with other processes that are on that server (maybe database, web, etc.) which will impact the performance. For example, Redis will store anything it cannot hold in memory in files, which means it then can become as slow or slower than a database query. You get the most out of Redis is you can keep your cache in memory.

Places you will see the most performance are complex queries that include relationships that take a long time to run straight from the database. You will see less benefit from small queries that already run fast from the database.

Hope this helps guide you in the right direction. I'll close this issue for now, as it is not directly related to this package.

Thanks for using the package, all the best on your project!