Redis (一)消息订阅和发送测试

〇、redis 配置

1、概况

本文基于 Ubuntu20.04 云服务器配置Redis,且在本地进行 Redis 测试。

2、目录概况

一、配置文件

位于 /config/app.yml 中,目的用于 Redis 初始化:

bash 复制代码
redis:
  addr: "39.104.**.28:6379"
  password: "password"
  DB: 0
  poolSize: 30
  minIdleConn: 30

二、main 文件

go 复制代码
package main

import (
	"ChatTest/router"
	"ChatTest/utils"
	"github.com/gin-gonic/gin"
)

func main() {
	utils.InitConfig()
	utils.InitRedis()
	r := gin.Default()
	r = router.Router()
	r.Run(":8000")
}

二、初始化文件

位于 /utils/system_init.go 文件中,目的用于初始化相关:

bash 复制代码
package utils

import (
	"fmt"
	"github.com/go-redis/redis/v8"
	"github.com/spf13/viper"
)

var (
	Red *redis.Client
)

// 初始化初始化文件

func InitConfig() {
	viper.SetConfigName("app")
	viper.AddConfigPath("/Users/luliang/GoLand/ChatTest/config") //带绝对路径
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println(err)
	}
}

// 初始化 Redis

func InitRedis() {
	Red = redis.NewClient(&redis.Options{
		Addr:         viper.GetString("redis.addr"),
		Password:     viper.GetString("redis.password"),
		DB:           viper.GetInt("redis.DB"),
		PoolSize:     viper.GetInt("redis.minIdleConn"),
		MinIdleConns: viper.GetInt("redis.minIdleConn"),
	})
	fmt.Println("config Redis:", viper.Get("redis"))
}

三、路由文件

路由文件位于 /router/app.go 中,目的是建立路由:

go 复制代码
package router

import (
	"ChatTest/service"
	"github.com/gin-gonic/gin"
)

func Router() *gin.Engine {
	r := gin.Default()
	r.GET("/send", service.SendMsg)
	r.GET("/recv", service.RecvMsg)
	return r
}

四、实现服务

位于/service/message.go中,是 HandlerFunc,且实现服务:

go 复制代码
package service

import (
	"ChatTest/utils"
	"context"
	"github.com/gin-gonic/gin"
)

func SendMsg(c *gin.Context) {
	cmd := utils.Red.Publish(context.Background(), "myRedis", "Hello, MyRedis0001!")
	if cmd != nil {
		c.JSON(200, gin.H{
			"code":    0,
			"message": "发送成功!",
		})
		return
	}
	c.JSON(200, gin.H{
		"code":    -1,
		"message": "发送失败!",
	})

}

func RecvMsg(c *gin.Context) {
	pubSub := utils.Red.Subscribe(context.Background(), "myRedis")
	defer pubSub.Close()

	ch := pubSub.Channel()

	for msg := range ch {
		c.JSON(200, gin.H{
			"code":    0,
			"message": msg.Payload,
		})
		// 根据业务逻辑决定是否终止循环并返回响应
		return
	}

	// 如果没有接收到消息,可以根据需要返回响应
	c.JSON(200, gin.H{
		"code":    -1,
		"message": "接受失败!",
	})
}

五、运行流程

这里面的核心就是Redis 的连接,以及在 Redis 中发布消息和订阅消息了。

1、消息的发布

go 复制代码
cmd := utils.Red.Publish(context.Background(), "myRedis", "Hello, MyRedis0001!")

调用Publish() 函数发布一条消息,这个 Publish() 是 go-redis中封装好的方法。

2、消息的订阅

go 复制代码
pubSub := utils.Red.Subscribe(context.Background(), "myRedis")

可以看到,go-redis 中使用消息的订阅和发布功能,可以使得消息发送和接受的过程异常简单!

全文完,感谢阅读!

相关推荐
X-⃢_⃢-X13 分钟前
十、Redis之布隆过滤器
数据库·redis·缓存
Nturmoils16 分钟前
订单号查出了三笔,我以为是数据脏了,其实是自己写错了
数据库
ZKNOW甄知科技20 分钟前
燕千云深度集成飞书:以AI之力,开启无感IT运维体验
大数据·运维·网络·数据库·人工智能·低代码·集成学习
TDengine (老段)35 分钟前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
汉知宝科技36 分钟前
历史案件数据迁移:知识产权管理系统落地的第一道门槛
大数据·数据库
这就是佬们吗1 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
吴声子夜歌1 小时前
MongoDB 4.x——SpringBoot框架整合
数据库·spring boot·mongodb
凤山老林1 小时前
MySQL“读已提交“并非万能药:深度解析RC隔离级别的盲区与适用边界
数据库·mysql
Database_Cool_1 小时前
阿里云 Tair(企业级内存数据库)vs 腾讯云 Redis 云缓存深度对比:性能/数据结构/成本全维度 Benchmark
数据库·阿里云·缓存
流星白龙1 小时前
【Redis】1.Redis特性
数据库·redis·缓存