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
}
相关推荐
iCxhust6 小时前
c# U盘映像生成工具
开发语言·单片机·c#
yangzhi_emo7 小时前
ES6笔记2
开发语言·前端·javascript
ai小鬼头7 小时前
Ollama+OpenWeb最新版0.42+0.3.35一键安装教程,轻松搞定AI模型部署
后端·架构·github
emplace_back8 小时前
C# 集合表达式和展开运算符 (..) 详解
开发语言·windows·c#
jz_ddk8 小时前
[学习] C语言数学库函数背后的故事:`double erf(double x)`
c语言·开发语言·学习
萧曵 丶8 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
xiaolang_8616_wjl8 小时前
c++文字游戏_闯关打怪2.0(开源)
开发语言·c++·开源
收破烂的小熊猫~8 小时前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
老任与码8 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba