Go整合Redis2.0发布订阅

Go整合Redis2.0发布订阅

Redis

batchfile 复制代码
goredis-cli --version
redis-cli 5.0.14.1 (git:ec77f72d)

Go

batchfile 复制代码
go get github.com/go-redis/redis/v8
golang 复制代码
package redis

import (
    "MyKindom-Server-v2.0/com/xzm/core/config/yaml"
    "MyKindom-Server-v2.0/com/xzm/core/config/yaml/pojo"
    "context"
    "fmt"
    "github.com/go-redis/redis/v8"
    "time"
)

// RDB
var RDB *redis.Client
var globalConfig = yaml.GlobalConfig

// initRedis 初始化Redis连接
func initRedis(config pojo.RedisConfig) error {
    RDB = redis.NewClient(&redis.Options{
        Addr:     config.Address,//Redis地址:localhost:6379
        Password: config.Password,//密码:123456
        DB:       config.DbIndex,//索引 :0
    })

    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    // 测试连接
    if err := RDB.Ping(ctx).Err(); err != nil {
        return fmt.Errorf("连接Redis失败: %v", err)
    }

    return nil
}

func init() {
    initRedis(globalConfig.Redis)
}
golang 复制代码
package main

import (
    "context"
    "fmt"

    "MyKindom-Server-v2.0/com/xzm/core/dadabase/redis"
)

/**
 * @Author: XuZhiMing
 * @Date: 2024/7/18 17:04
 * @Description: 测试redis发布订阅
 */
func main() {

    backgroundCtx := context.Background()
    channelName := "new"
    go subscribeChannel(backgroundCtx, channelName)
    for {
        var message string
        fmt.Print("请输入消息: ")
        fmt.Scanln(&message)
        err := publishMessage(backgroundCtx, channelName, message)
        if err != nil {
            fmt.Println("发布消息失败:", err)
        }
    }
    // 保持程序运行,以便订阅者可以接收到消息
    select {}

}

// 订阅指定频道
func subscribeChannel(ctx context.Context, channel string) {
    pubsub := redis.RDB.Subscribe(ctx, channel)
    defer pubsub.Close()

    fmt.Printf("已订阅频道 [%s]\n", channel)

    // 监听消息
    ch := pubsub.Channel()
    for msg := range ch {
        fmt.Printf("[收到] 频道: %s | 内容: %s\n", msg.Channel, msg.Payload)
    }
}

// 发布消息到指定频道
func publishMessage(ctx context.Context, channel, message string) error {
    err := redis.RDB.Publish(ctx, channel, message).Err()
    if err != nil {
        return err
    }
    fmt.Printf("[发布] 频道: %s | 内容: %s\n", channel, message)
    return nil
}
相关推荐
花酒锄作田4 小时前
MCP官方Go SDK尝鲜
golang·mcp
兩尛4 小时前
c++知识点2
开发语言·c++
fengfuyao9854 小时前
海浪PM谱及波形的Matlab仿真实现
开发语言·matlab
xiaoye-duck5 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
Hx_Ma165 小时前
SpringMVC框架提供的转发和重定向
java·开发语言·servlet
期待のcode6 小时前
原子操作类LongAdder
java·开发语言
lly2024067 小时前
C 语言中的结构体
开发语言
JAVA+C语言7 小时前
如何优化 Java 多主机通信的性能?
java·开发语言·php
青岑CTF9 小时前
攻防世界-Ics-05-胎教版wp
开发语言·安全·web安全·网络安全·php
Li emily9 小时前
如何通过外汇API平台快速实现实时数据接入?
开发语言·python·api·fastapi·美股