本文基于 Ubuntu20.04 云服务器配置Redis,且在本地进行 Redis 测试。
位于 /config/app.yml
中,目的用于 Redis 初始化:
redis:
addr: "39.104.**.28:6379"
password: "password"
DB: 0
poolSize: 30
minIdleConn: 30
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
文件中,目的用于初始化相关:
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
中,目的是建立路由:
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,且实现服务:
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 中发布消息和订阅消息了。
cmd := utils.Red.Publish(context.Background(), "myRedis", "Hello, MyRedis0001!")
调用Publish() 函数发布一条消息,这个 Publish() 是 go-redis中封装好的方法。
pubSub := utils.Red.Subscribe(context.Background(), "myRedis")
可以看到,go-redis 中使用消息的订阅和发布功能,可以使得消息发送和接受的过程异常简单!
全文完,感谢阅读!