我们运行Laravel 5.1 API,在某些情况下,它会将命令排队以使用各种包和设置来配置服务器实例。每个实例都有一个特定的 ID,该 ID 包含在队列项数据中。该实例 ID 又用作 Redis 缓存键的前缀。例如:"instance-0:clients:list"表示在实例 ID 0 上运行的客户端列表。"cache.prefix"配置设置通过具有当前实例 ID 的中间件进行更新。
各种创建/更新/删除端点"忘记"缓存键,然后在调用列表/显示端点时重建这些键。到目前为止,当这些操作直接通过 API 端点发生时,一切都很好。如果我使用"工匠队列:工作"手动运行队列,它也可以工作。
但。。。
常规队列通过受监督程序作为守护程序运行。当队列作为守护程序运行时,缓存前缀永远不会更改,因为(我猜)它在运行给定队列项时不会通过中间件。如果我手动(而不是通过主管)将队列作为守护程序运行,也会发生这种情况。
我已经尝试通过Config::set('cache.prefix', 'instance-X')
和putenv('CACHE_PREFIX=instance-X')
强制设置值,但它们对缓存存储本身使用的实际前缀没有影响。我能够成功设置它的唯一方法是在".env"文件中设置CACHE_PREFIX,但它不适用于架构。我们在 Docker 容器中运行 API 和工作线程实例,并且 worker 不特定于任何给定的 API 实例,因此在队列项数据中包含实例 ID 以供以后使用。
因此,我有点纠结于如何基于每个队列项目设置缓存前缀。这可能吗?任何帮助将不胜感激!
试试方法Cache::setPrefix('instance-X')
。
它将强制更改给定请求的缓存前缀。它应该对您有用,因为我有一个类似的用例,但我需要它来管理我的缓存。它可能会也可能不会起作用。我还没有用队列对此进行测试,但由于缓存前缀由 Laravel 中的会话和队列驱动程序共享,它应该可以工作。
需要明确的是,该方法不会影响配置值。如果在运行方法后立即使用 config('cache.prefix')
获取缓存前缀,则该值仍将是配置文件中的值。