Skip to content

Commit

Permalink
Example #18: PUB-SUB using channels
Browse files Browse the repository at this point in the history
  • Loading branch information
tisnik committed Jun 30, 2020
1 parent c42af79 commit a14c445
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 0 deletions.
88 changes: 88 additions & 0 deletions lesson7/redis/18_pub_sub_channel/04_pub_sub_channel.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package main

import (
"context"
"fmt"
"time"

"github.com/go-redis/redis/v8"
)

// adresa určující službu Redisu, která se má použít
const redisAddress = "localhost:6379"

// jméno kanálu
const channelName = "c1"

// struktura obsahující "session"
type redisSession struct {
client *redis.Client
context context.Context
}

// zdroj zpráv
func publisher(session redisSession, channel string, from int, to int) {
for i := from; i < to; i++ {
err := session.client.Publish(session.context, channel, i).Err()
if err != nil {
panic(err)
}
time.Sleep(1 * time.Second)
}
}

// příjemce zpráv
func subscriber(session redisSession, channel string) {
pubsub := session.client.Subscribe(session.context, channel)
ch := pubsub.Channel()

for message := range ch {
fmt.Printf("Channel: %s Message: '%s'\n",
message.Channel,
message.Payload)
}
}

// vstupní bod do demonstračního příkladu
func main() {
// vytvoření nového klienta s předáním konfiguračních parametrů
client := redis.NewClient(&redis.Options{
Addr: redisAddress,
Password: "", // no password set
DB: 0, // use default DB
})

// neměli bychom zapomenout na ukončení práce s klientem
defer func() {
err := client.Close()
if err != nil {
panic(err)
}
}()

// získáme kontext
context := client.Context()

// vytvoříme session
session := redisSession{
client: client,
context: context,
}

// pokus o klasický handshake typu PING-PONG
_, err := client.Ping(context).Result()
if err != nil {
panic(err)
}

// smazání kanálu, pokud existoval
client.Del(context, channelName)

// nyní můžeme spustit několik příjemců zpráv
go subscriber(session, channelName)
go subscriber(session, channelName)
go subscriber(session, channelName)

// spustíme zdroj zpráv
publisher(session, channelName, 0, 10)
}
5 changes: 5 additions & 0 deletions lesson7/redis/18_pub_sub_channel/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module redis1

go 1.13

require github.com/go-redis/redis/v8 v8.0.0-beta.5

0 comments on commit a14c445

Please sign in to comment.