Redis默认提供16个独立的数据库,但是Laravel框架默认使用数据库0来存储sessions和cache。
我们的解决方案是让Redis缓存使用数据库0,而将数据库1用于Session,从而解决了通过运行php artisan cache:clear
清除session时出现的问题。
修改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,
],
],
session
连接修改 config/session.php
文件,更改如下:
'connection' => null,
'connection' => 'session',
修改 .env
文件,更改 SESSION_DRIVER
:
SESSION_DRIVER=redis
执行以下Artisan命令,然后检查您的登录状态:
php artisan cache:clear
如果登录状态持续存在,那就万事大吉!
FLUSHDB
以清除缓存。SCAN
来删除旧键。请参见http://redis.io/commands/scan
顺便说一句,通常将缓存和其他内容放在同一个Redis实例中是一个坏主意,因为在缓存中通常使用基于LRU的驱逐方法,并且您不希望将其与不太易失的键混合在一起。https://laravel.com/docs/5.2/redis#configuration
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
对于 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,
],
]
Laravel Cache::clear() 发送 Redis flushall 命令,会清空所有缓存,因此在我的经验中并不是非常有用。您需要扩展缓存类并创建一个自定义集合来索引您想要清除的缓存数据。然后构建另一个函数来读取该集合并为集合中的每个键发出 Redis del() 命令。如果需要,可以发布一些工作代码并进行进一步详细说明。
Notagolfer 的建议将缓存和会话分离到不同的 Redis 数据库中是个好主意,但您仍需要扩展缓存类以实现 Redis 数据库配置切换。