功能:这里主要编写一个接口,将其json 数据存入对应的redis队列中,并统计每天的每小时请求数量
环境:
go
version go1.22.0 linux/amd64
平台 linux X64
步骤一 新建目录 命令如下:
mkdir FormData
步骤二 新增配置文件config.yaml 内容如下:
#开启的端口
server:
port: 8082
# 存储数据数据
redis_mq:
host: 127.0.0.1
port: 6379
password:
db: 2
queue_key_name: data_list
redis_count:
host: 127.0.0.1
port: 6379
password:
db: 2
步骤三 编写主要逻辑 main.go 内容如下:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-redis/redis"
"gopkg.in/yaml.v3"
"io/ioutil"
"log"
"strconv"
"sync"
"time"
)
var (
redisClient *redis.Client
redisCountClient *redis.Client
mutex sync.Mutex
wg sync.WaitGroup
)
func main() {
// 初始化 Redis 连接
config, err := loadConfig("config.yaml")
if err != nil {
log.Fatal(err)
}
// fmt.Printf("%v", config)
//}
dbnum, err := strconv.Atoi(config["redis_mq"]["db"])
if err != nil {
fmt.Println("转换失败:", err)
return
}
redisClient = redis.NewClient(&redis.Options{
Addr: config["redis_mq"]["host"] + ":" + config["redis_mq"]["port"],
Password: config["redis_mq"]["password"],
DB: dbnum,
PoolSize: 50,
})
countdbnum, err := strconv.Atoi(config["redis_count"]["db"])
if err != nil {
fmt.Println("转换失败:", err)
return
}
redisCountClient = redis.NewClient(&redis.Options{
Addr: config["redis_count"]["host"] + ":" + config["redis_count"]["port"],
Password: config["redis_count"]["password"],
DB: countdbnum,
PoolSize: 50,
})
// 初始化 Gin 框架
router := gin.Default()
// 定义接口路由
router.POST("/pushData", func(c *gin.Context) {
pushData(c, config)
})
router.GET("/pushData", func(c *gin.Context) {
pushData(c, config)
})
// 启动服务
router.Run(fmt.Sprintf(":%s", config["server"]["port"]))
}
func pushData(c *gin.Context, config map[string]map[string]string) {
//defer wg.Done()
// 获取请求参数
// 计数器逻辑
paramsJson, err := c.GetRawData()
if err != nil {
log.Println("读取数据错误:", err)
c.JSON(500, gin.H{"status": 500, "message": "error_data"})
return
}
wg.Add(1)
go pushtoredis(string(paramsJson), config)
//mutex.Lock()
// 存储到 Redis
//mutex.Unlock()
// 返回成功响应
c.JSON(200, gin.H{"Status": 200, "Message": "成功", "Data": map[string]string{"ShotPendingSize": ""}})
}
func pushtoredis(paramsJson string, config map[string]map[string]string) error {
defer wg.Done()
now := time.Now()
month := now.Month()
day := now.Day()
hour := now.Hour()
err := redisClient.LPush(config["redis_mq"]["queue_key_name"], paramsJson).Err()
if err != nil {
log.Println("推入redis错误:", err)
return err
}
countKey := fmt.Sprintf("from_data_%d_%d_%d", month, day, hour)
err = redisCountClient.Incr(countKey).Err()
if err != nil {
log.Println("计数器错误:", err)
// 处理计数器错误情况
return err
}
return nil
}
func loadConfig(filename string) (map[string]map[string]string, error) {
// 读取配置文件
data, err := ioutil.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf("无法读取配置文件: %s", err)
}
// 解析配置文件
var config map[string]map[string]string
err = yaml.Unmarshal(data, &config)
if err != nil {
return nil, fmt.Errorf("配置文件解析失败: %s", err)
}
return config, nil
}
步骤四 项目初始化 进行依赖 命令如下:
go mod init FormData
步骤五 项目所需要的依赖添加到go.mod 命令如下:
go mod tidy
步骤六 先运行一下 如果不报错 在进行编译
go run main.go
go build -o for_data # 这里重命名了
步骤七 运行 这里需要主要 端口和redis 相关配置 可以根据实际情况 修改config.yaml 。修改后重新运行即可,无需重新编译。命令如下:
直接在shell 中 运行命令
./form_data
若执行不了 请注意相关权限
chmod + form_data
步骤八 请求接口,验证接口处理是否正常。
打开postman
请求地址 http://127.0.0.1:8082/pushData
可以观察go的后台输出 如下图所示:
关注redis 如下图所示: