14
votes

I am using Redis to cache queries/routes in Laravel 5.2.

I have 3 environments running on the same web server i.e "production", "staging", and "development."

For each environment I set a different cache prefix value to allow me to link the cache to different environment.

In the config/cache.php file I changed the line

'prefix' => 'laravel',

To

'prefix' => ENV('CACHE_PREFIX', 'laravel'),

Then in my .env file, I added the prefix for each environment like this

For Dev

CACHE_PREFIX="LaravelDev"

For Staging

CACHE_PREFIX="LaravelStaging"

For Production

CACHE_PREFIX="LaravelProduction"

I know I can clear the cache from the command line like this

php artisan cache:clear

But the code above will clear the cache for all of my environments.

I only want to clear the cache for "LaravelDev" only and leave alone "LaravelStaging" and "LaravelProduction"

How can I clear the cache for a specific environment?

2

2 Answers

1
votes

Instead of using CACHE_PREFIX you can use different redis databases. For ex: production => 1, staging => 2, development => 3. Use this links if you want to be a little bit more familiar with it:

  1. What's the Point of Multiple Redis Databases?
  2. List All Redis Databases

So, in your .env file for each environment (production/stage/dev) you need to define different REDIS_CACHE_DB env value.

Link to the line uses this variable https://github.com/laravel/laravel/blob/2a2522d8824c0852e30a7e3e07d46a543eb4b33d/config/database.php#L142 . Examples of .env:

.env.production

REDIS_CACHE_DB=1

.env.stage

REDIS_CACHE_DB=2

.env.development

REDIS_CACHE_DB=3

Don't forget to clear config cache after changing env variables: https://laravel.com/docs/7.x/configuration#configuration-caching

Hope this helps!

0
votes

What the cache:clear artisan command does calls flush function on current connector. As caching engines varies with functionality I don't think it's possible to expire keys selectively keeping cache API universal. Engines like Redis provides such functionality, but memcached for example don't.

If you're using Redis you can modify default connector to use 'SCAN / DEL' commands for flush() method. Still this is not going to be very effective.

If your application uses cache correctly flushing it should not cause any problems as the cache will rebuild itself. You should never expect some data being in the cache as it might expire anyway.