开始

文档这玩意儿 得看 得认真看

使用项目 eggjs laravel

  • redispub/sub 基于同一 redisdb 无关
  • sub 是单项的 只能接受事件 不能发布
  • sub 要在 pub 之前启动 不然 收不到之前的消息

egg

app/config/config.local.ts

相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const redis = {
host: '127.0.0.1',
port: 6379,
password: 'root',
db: 1,
}

config.redis = {
clients: {
liveSubscribe: redis,
livePublish: redis,
redis,
},
}

app/schedule/liveSubscribe.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import { Subscription } from 'egg'

export default class liveSubscribe extends Subscription {
static get schedule() {
return {
type: 'worker',
immediate: true,
}
}

// 订阅
async subscribe() {
// 此处 liveSubscribe 因为 sub 事件会阻塞下一步
// https://github.com/eggjs/egg/issues/1524#issuecomment-336918876

// 此处 hometown_database_live 为 通道 之所以这么长 是因为 laravel 自带一个前缀
this.app.redis.get('liveSubscribe').subscribe('hometown_database_live', (err, result) => {
if (err) {
throw err
}
console.log(result, 'subscribe')
})

// 此处 message 为接受到新消息
this.app.redis.get('liveSubscribe').on('message', (channel, data) => {
// channel 通道
// 收到 data 传递的数据 丫丫丫丫丫丫的
console.log(channel, JSON.parse(data))
})
}

// 发布
async publish() {
// 此处 livePublish 为 另一个 redis 进程 也可以用 redis
// 此处 hometown_database_comment 为 通道名
this.app.redis.get('livePublish').publish(
'hometown_database_comment',
JSON.stringify({
body: '收到一个新的',
}),
)
}
}

laravel

config/database.php

1
2
3
4
5
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
// 就这个前缀 `hometown_database_`
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],

相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use Illuminate\Support\Facades\Redis;

// 订阅 这个进程会一直卡住 推荐不要这么设计
public function subscribe()
{
// 至于这里为什么这么短 因为他自己加了前缀 hometown_database_comment
Redis::subscribe(['comment'], function ($message)
{
// $message 收到一个新的
\Log::info($message);
});
}

// 推送
public function publish()
{
// live 通道名 全称应为 hometown_database_live
// 给 hometown_database_live 发送数据
$count = Redis::publish('live', json_encode([
'body' => '丫丫丫丫丫丫的',
]))

// 如果此通道有人监听 那么他就不是0

return $count;
}

其他

如果发了收不到

  • 那么 可以可虑适用 redis 相关命令 监听这个通道SUBSCRIBE hometown_database_live

  • 检查是否开启了通道功能

seo

  • egg laravel redis 订阅
  • node php redis 订阅
  • redis subscribe publish

参考

完工