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
}
相关推荐
哥不想学算法5 小时前
【C++】字符串字面量拼接
开发语言·c++
葫芦和十三6 小时前
图解 MongoDB 28|块与迁移:balancer 怎么均衡数据
后端
葫芦和十三6 小时前
图解 MongoDB 27|分片策略:范围分片 vs 哈希分片
后端·mongodb·agent
paopaokaka_luck6 小时前
英语单词学习系统的设计与实现(基于艾宾浩斯遗忘曲线的智能复习机制、语音朗读、多题型测试与错题自动收录、Echarts图形化分析)
vue.js·spring boot·后端·echarts
gugucoding7 小时前
21. 【C语言】打包不同类型:结构体
c语言·开发语言
Brookty7 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
我叫黑大帅7 小时前
MySQL 并发插入竞态问题:原子写入实践指南
后端·mysql·面试
F20226974868 小时前
西门子 PLC 与 C# 通信
开发语言·c#
gugucoding8 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表