如何在保留会话数据的情况下清除Redis缓存:Laravel 5

13
我在使用redis作为会话驱动程序,我想要清除缓存同时保留会话数据,这样用户就可以保持登录状态。关于重构或处理当前情况的建议是什么? 注意: 我不想为会话和其他缓存数据使用单独的redis实例。
5个回答

33

简介

Redis默认提供16个独立的数据库,但是Laravel框架默认使用数据库0来存储sessions和cache。

我们的解决方案是让Redis缓存使用数据库0,而将数据库1用于Session,从而解决了通过运行php artisan cache:clear清除session时出现的问题。

1. 设置Session Redis连接

修改config/database.php文件,在redis选项中添加session键:

'redis' => [

   'cluster' => false,

   'default' => [
       'host'     => env('REDIS_HOST', 'localhost'),
       'password' => env('REDIS_PASSWORD', null),
       'port'     => env('REDIS_PORT', 6379),
       'database' => 0,
   ],

   'session' => [
         'host'     => env('REDIS_HOST', 'localhost'),
         'password' => env('REDIS_PASSWORD', null),
         'port'     => env('REDIS_PORT', 6379),
         'database' => 1,
   ],
],

2. 利用 session 连接

修改 config/session.php 文件,更改如下:

'connection' => null,

To:
'connection' => 'session',

3. 使用 Redis 作为会话驱动程序

修改 .env 文件,更改 SESSION_DRIVER

SESSION_DRIVER=redis

4. 测试

执行以下Artisan命令,然后检查您的登录状态:

php artisan cache:clear

如果登录状态持续存在,那就万事大吉!


1
如果您有集群(不支持多个数据库),则此方法无法正常工作。 - guyromb

3
我不熟悉Laravel,但通常最好的两个选择是:
  1. 更改缓存键的格式。您应该使用带版本号的缓存键,以便将来可以进行操作,例如“cache.1.”,这样您就可以递增,然后一次使所有键都无关紧要。
  2. 将缓存移动到同一Redis实例中的另一个db编号。这样,您也可以稍后在该db编号上执行FLUSHDB以清除缓存。
在这两个选项中,如果缓存键没有过期时间,则应创建一个脚本,使用SCAN来删除旧键。请参见http://redis.io/commands/scan 顺便说一句,通常将缓存和其他内容放在同一个Redis实例中是一个坏主意,因为在缓存中通常使用基于LRU的驱逐方法,并且您不希望将其与不太易失的键混合在一起。

2

https://laravel.com/docs/5.2/redis#configuration

'redis' => [
    'cluster' => false,
    'default' => [
        'host'     => '127.0.0.1',
        'port'     => 6379,
        'database' => 0,
    ],
],

在redis连接选项中有一个“数据库”,只需为会话和缓存选择不同的数据库。我希望redis缓存驱动程序在清除缓存时使用flushdb而不是flushall :)。

注意:我不想为会话和其他缓存数据使用单独的redis实例。 - rajangupta
1
你不需要创建不同的Redis实例。一个Redis实例可以提供多个“数据库”,你只需要指定要使用哪一个即可。 (http://www.rediscookbook.org/multiple_databases.html) - my-nick

1

对于 Laravel 9(较旧版本类似):

1. 更新会话配置

你必须在 .env 文件中输入:

SESSION_CONNECTION=session

该配置然后加载到config/session.php文件中。

'connection' => env('SESSION_CONNECTION'),

这告诉 Laravel 将会把 sessions 存储在独立的 Redis/数据库连接中

2. 更新 Redis 配置

在 config/database.php 中添加新的 Redis 连接以供 sessions 使用

'redis' => [
   ...
   'session' => [
         'host'     => env('REDIS_HOST', 'localhost'),
         'password' => env('REDIS_PASSWORD', null),
         'port'     => env('REDIS_PORT', 6379),
         'database' => 0,
   ],
   ...
]

您可以使用数据库编号0至16。对于其他连接,请使用不同的数据库编号。

3. 清除缓存(不包括 Session)

现在,您可以使用以下代码清除 Redis 缓存:

$redisConnection = \Illuminate\Support\Facades\Redis::connection('default');
$redisConnection->flushDB();

提示:您可以将该代码放入自定义命令中,并使用artisan运行它。

奖励:您可以使用以下命令查看和清除每个连接的所有redis数据:

$redisSession = \Illuminate\Support\Facades\Redis::connection('session');//session|queue|default
$redisSessionKeys = $redisSession->keys('*');
$redisSession->flushDB();
dd($redisSessionKeys);

额外福利2:您也可以添加“Redis数据库”来管理队列,这样队列任务、会话和缓存就可以分开并且您可以只清除其中的一个。

'redis' => [
   ...
   'default' => [
         'host'     => env('REDIS_HOST', 'localhost'),
         'password' => env('REDIS_PASSWORD', null),
         'port'     => env('REDIS_PORT', 6379),
         'database' => 0,
   ],
   'session' => [
         'host'     => env('REDIS_HOST', 'localhost'),
         'password' => env('REDIS_PASSWORD', null),
         'port'     => env('REDIS_PORT', 6379),
         'database' => 1,
   ],
  'queue' => [
         'host'     => env('REDIS_HOST', 'localhost'),
         'password' => env('REDIS_PASSWORD', null),
         'port'     => env('REDIS_PORT', 6379),
         'database' => 2,
   ],
]

0

Laravel Cache::clear() 发送 Redis flushall 命令,会清空所有缓存,因此在我的经验中并不是非常有用。您需要扩展缓存类并创建一个自定义集合来索引您想要清除的缓存数据。然后构建另一个函数来读取该集合并为集合中的每个键发出 Redis del() 命令。如果需要,可以发布一些工作代码并进行进一步详细说明。

Notagolfer 的建议将缓存和会话分离到不同的 Redis 数据库中是个好主意,但您仍需要扩展缓存类以实现 Redis 数据库配置切换。


3
LaravelжЎҶжһ¶дёӯзҡ„RedisStore.phpж–Ү件дёӯзҡ„flushж–№жі•дјҡи°ғз”Ё$this->connection->flushdb()пјҢиҜҘж–№жі•жңҖз»ҲдјҡдҪҝз”ЁRedisзҡ„FLUSHDBе‘Ҫд»ӨгҖӮFLUSHDBе‘Ҫд»ӨдјҡеҲ йҷӨжҢҮе®ҡиҝһжҺҘ/ж•°жҚ®еә“зҡ„жүҖжңүй”®еҖјеҜ№пјҢй»ҳи®Өжғ…еҶөдёӢиҝһжҺҘдёә0пјҢеҸҜд»Ҙд»Һй…ҚзҪ®дёӯзңӢеҲ°гҖӮеҰӮжһңжӮЁеңЁдёҚеҗҢзҡ„Redisж•°жҚ®еә“дёӯе°Ҷзј“еӯҳй”®е’ҢдјҡиҜқй”®еҲҶејҖпјҢеҲҷдҪҝз”ЁFLUSHALLе‘Ҫд»ӨдјҡеҲ йҷӨжүҖжңүж•°жҚ®еә“дёӯзҡ„жүҖжңүй”®еҖјеҜ№пјҢиҝҷз§ҚиЎҢдёәеҸҜиғҪжҳҜдёҚеҸҜеҸ–зҡ„гҖӮ - Shawn Lindstrom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接