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
}
相关推荐
追逐时光者7 小时前
精选 10 款 .NET 开源免费、功能强大的 Windows 效率软件
后端·.net
追逐时光者7 小时前
一款开源、免费的 WPF 自定义控件集
后端·.net
phltxy8 小时前
从零入门JavaScript:基础语法全解析
开发语言·javascript
S***q3778 小时前
Spring Boot管理用户数据
java·spring boot·后端
天“码”行空8 小时前
java面向对象的三大特性之一多态
java·开发语言·jvm
毕设源码-郭学长8 小时前
【开题答辩全过程】以 基于SpringBoot框架的民俗文化交流与交易平台的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
l***21789 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
f***14779 小时前
SpringBoot实战:高效实现API限流策略
java·spring boot·后端
计算机毕设VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
odoo中国9 小时前
Odoo 19 模块结构概述
开发语言·python·module·odoo·核心组件·py文件按