laravel api 中使用 redis 发布时收不到消息

问题描述 投票:0回答:3

我使用 laravel api 作为后端,使用 vue 作为前端。这些是独立项目。当我点击 redis 连接后发布的 api 时,如

$redis = Redis::connection();

$redis->publish('new_message_sent',json_encode($request->all()));

它没有任何作用。事实上,当我点击 api(使用 postman)并返回 $redis 对象时,它返回一个空对象。

这是订阅的节点服务器代码

io.on("connection", function(socket) {
   console.log("Client Connecteddddd");
   var redisClient = redis.createClient();
   redisClient.subscribe("new_message_sent");


   redisClient.on("new_message_sent", function(channel, message) {
       message = JSON.parse(message);
       console.log(message);    
   });

   redisClient.on("disconnect", function() {
       redisClient.quit();
   });
});
node.js laravel redis publish-subscribe
3个回答
7
投票

我偶然发现了类似的情况,我希望我的 Redis 客户端能够收到来自 Laravel 的

Redis
Facade 的已发布消息,但事实并非如此。

我预计在

Redis::publish('foo', 'bar')
中运行
SUBSCRIBE foo
时会拾取
redis-cli

MONITOR
中运行
redis-cli
后,我注意到发布的频道名称与我预期的不同 -
{app-name}_database_foo

这是在

database.php
键的
redis.options.prefix
中配置的,默认情况下是
env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
,了解这一点/更改它会有所帮助。


0
投票

您的订阅代码是什么样的?

使用 Redis 的 pub/sub 接收端应该如下所示:

  Redis::subscribe(['your-channel'], function ($message) {
            echo $message;
        });

这将是一个长期运行的过程。这将运行并回显发布到“您的频道”的任何内容,直到有东西中断它。

如果您希望将信息传输到最终用户的浏览器,则需要额外的步骤,例如 Websocket。

pub/sub 的本质意味着它永远不会知道在 subscribe() 发生之前发送的消息,只知道那些在运行时发生的消息。

对于发布,您不需要首先解析连接。

Redis::publish('new_message_sent', json_encode($request->all()));

https://laravel.com/docs/master/redis


0
投票

这也许有帮助:
Laravel 11,在 config/database.php 中,你有:

'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        ],

所以,laravel 添加前缀。

要解决此问题,您只需定义空前缀即可:

REDIS_PREFIX=
© www.soinside.com 2019 - 2024. All rights reserved.