Redis 会话、缓存与队列
此扩展库允许将 Redis 用作缓存、会话及队列驱动。你只需通过本地扩展器(位于 Flarum 安装根目录下的 extend.php 文件)来启用这些服务。详情请参阅下方的“配置”部分。
安装
通过 Composer 手动安装:
composer require fof/redis:"*"
配置
在你的 extend.php 文件中:
return [
new FoF\Redis\Extend\Redis([
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1
])
];
此操作将启用基于 Redis 的会话、缓存和队列功能。
多实例部署: 此扩展可通过 Redis 的发布/订阅模式,处理多个 Flarum 实例(Pod/容器)间的分布式缓存失效。详情请参阅 DISTRIBUTED_CACHE.md 文件。
重要提示: 请参阅下方的“为各服务使用不同数据库”部分,为缓存、会话和队列分配独立的数据库。因为如果它们共用同一个数据库,清除缓存的操作也会一并清除会话和队列任务。
高级配置
- 禁用特定服务:
return [
(new FoF\Redis\Extend\Redis([
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1,
]))->disable(['cache', 'queue'])
];
- 为各服务使用不同数据库:
return [
(new FoF\Redis\Extend\Redis([
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1,
]))
->useDatabaseWith('cache', 1)
->useDatabaseWith('queue', 2)
->useDatabaseWith('session', 3)
];
- 完全独立的配置数组:
return [
(new FoF\Redis\Extend\Redis([
'connections' => [
'cache' => [
'host' => 'cache.int.yoursite.com',
'password' => 'foo-bar',
'port' => 6379,
'database' => 1,
],
'queue' => [
'host' => 'queue.int.yoursite.com',
'password' => 'foo-bar',
'port' => 6379,
'database' => 1,
],
'session' => [
'host' => 'session.int.yoursite.com',
'password' => 'foo-bar',
'port' => 6379,
'database' => 1,
],
],
]))
];
- 使用集群:
return [
(new FoF\Redis\Extend\Redis([
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1,
'options' => [
'replication' => 'sentinel',
'service' => 'mymaster:26379',
]
]))
->useDatabaseWith('cache', 1)
->useDatabaseWith('queue', 2)
->useDatabaseWith('session', 3)
];
- 启用缓存失效的发布/订阅功能(应用启动后自动启动订阅者):
return [
(new FoF\Redis\Extend\Redis([
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1,
'pubsub' => [
'enabled' => true,
'autostart' => true,
'channel' => 'flarum:cache:invalidate',
'delay' => 0,
'spawn_lock_ttl' => 300,
],
]))
];
队列
请确保启动你的队列工作进程,具体细节可参考 Laravel 文档。你可以使用 php flarum queue:work 命令来测试工作进程是否能正常启动。
队列选项
队列允许添加多个选项,如 retry_after、block_for 和 after_commit。你可以在配置中添加一个 queue 数组来设置它们:
return [
(new FoF\Redis\Extend\Redis([
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1,
'queue' => [
'retry_after' => 120, // 秒
'block_for' => 5, // 秒
'after_commit' => true
]
]))
->useDatabaseWith('cache', 1)
->useDatabaseWith('queue', 2)
->useDatabaseWith('session', 3)
];
你可以在 Laravel 文档 中查阅这些选项的具体含义。
从 blomstra/flarum-redis 迁移
只需将你 extend.php 文件中使用的命名空间从 Blomstra\Redis... 更新为 FoF\Redis... 即可。
更新
composer update fof/redis
常见问题
为什么 storage/cache 目录下仍有文件?
部分代码仍然依赖物理文件的存在。这包括:
- 格式化程序缓存 (
storage/formatter/*) - TextFormatter 配置
- 本地化缓存 (
storage/locale/*) - 编译后的 Symfony 翻译目录
- 视图缓存 (
storage/views/*) - 编译后的 Blade 模板
这些文件缓存可以通过 Redis 的发布/订阅功能在多个实例间同步。详情请参阅 DISTRIBUTED_CACHE.md 文件。
运行多个 Flarum 实例(水平扩展)?
当你在多个 Pod/容器(如 Kubernetes、ECS 等)中运行 Flarum 时,此扩展可以通过发布/订阅模式处理缓存失效。
工作原理:
- 当在一个实例上清除缓存时,所有其他实例都会通过发布/订阅收到通知。
- 文件缓存会立即同步。
- 需要运行缓存订阅者进程(可设置自动启动)。
请参阅 DISTRIBUTED_CACHE.md 获取关于以下内容的完整文档:
事件
CacheConnectionReady
此事件在应用启动序列完成后(即核心的 ApplicationBooted 事件之后)被派发。
链接
包含对 Flarum 1.x 和 2.x 的支持。