php 如何在保留会话数据的同时清除redis缓存:拉腊维尔5

l5tcr1uw  于 2022-11-28  发布在  PHP
关注(0)|答案(5)|浏览(175)

我正在使用redis作为会话驱动程序,我想在保留会话数据的同时清除该高速缓存,这样用户基本上可以保持登录状态。关于重组或处理当前情况有什么建议吗?

注意:我不想为会话和其他缓存数据使用单独redis示例。

jogvjijk

jogvjijk1#

简介
默认情况下,redis为您提供了16个独立的数据库,但是laravel开箱即用将尝试为会话和缓存使用数据库0。
我们的解决方案是让Redis缓存使用数据库0,而数据库1用于Session,在那里通过运行php artisan cache:clear来解决session清除问题。

1.建立会话Redis连接

修改config/database.php,将session键添加到redis选项中:

'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,

至:

'connection' => 'session',

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

修改.env,变更SESSION_DRIVER

SESSION_DRIVER=redis

4.测试完毕

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

php artisan cache:clear

如果登录状态仍然存在,瞧!

bvuwiixz

bvuwiixz2#

我不知道拉拉威尔,但总的来说,最好的两个选择是:
1.改变该高速缓存键的格式。你应该使用版本化的缓存键,这样你就可以在将来这样做,比如“cache.1.”这样你就可以增加,然后它会让你所有的键一次变得不相关。
1.该高速缓存移到同一个redis示例中的另一个数据库号,这样你以后也可以在那个数据库号上执行FLUSHDB来清除缓存。
在这两个选项中,在第一次执行此操作后,如果该高速缓存键没有过期,则应创建一个脚本,使用SCAN删除旧键。
顺便说一句,在同一个redis示例中保存缓存和其他东西通常不是一个好主意,因为在缓存中通常使用基于LRU的逐出,并且不希望将其与不易变的键混合使用。

mgdq6dx1

mgdq6dx13#

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进行刷新:)。

vvppvyoh

vvppvyoh4#

Laravel Cache::clear()发送Redis flushall命令,该命令将转储所有内容,因此在我的经验中不是很有用。您需要扩展该高速缓存类并创建一个自定义集合来索引您希望能够清除的缓存数据。然后构建另一个函数来读取该集合,并对集合中的每个键发出Redis del()命令。发布一些工作代码,如果需要,将进一步详细说明
Notagolfers建议将cache和session分离到不同的Redis数据库中,这不是一个简单的调用,但是您仍然需要扩展该高速缓存类来实现Redis数据库配置开关

jxct1oxe

jxct1oxe5#

对于laravel 9(与较老型号类似):

1.更新会话配置

必须输入.env:

SESSION_CONNECTION=session

然后将该配置加载到config/session.php中

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

它告诉laravel将会话存储在单独的redis/数据库连接中

2.更新redis配置

在config/database.php为会话添加新的redis连接

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

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

3.清除缓存(不接触会话)

现在你可以用这段代码清除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,
   ],
]

相关问题