功能:这里主要编写一个接口,将其json 数据存入对应的redis队列中,并统计每天的每小时请求数量
环境:
go
version go1.22.0 linux/amd64
平台 linux X64
步骤一 新建目录 命令如下:
mkdir FormData
步骤二 新增配置文件config.yaml 内容如下:
#开启的端口
server:port: 8082# 存储数据数据
redis_mq:host: 127.0.0.1port: 6379password:db: 2queue_key_name: data_listredis_count:host: 127.0.0.1port: 6379password:db: 2
步骤三 编写主要逻辑 main.go 内容如下:
package mainimport ("fmt""github.com/gin-gonic/gin""github.com/go-redis/redis""gopkg.in/yaml.v3""io/ioutil""log""strconv""sync""time"
)var (redisClient *redis.ClientredisCountClient *redis.Clientmutex sync.Mutexwg 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]stringerr = 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.gogo build -o for_data # 这里重命名了
步骤七 运行 这里需要主要 端口和redis 相关配置 可以根据实际情况 修改config.yaml 。修改后重新运行即可,无需重新编译。命令如下:
直接在shell 中 运行命令
./form_data
若执行不了 请注意相关权限
chmod + form_data
步骤八 请求接口,验证接口处理是否正常。
打开postman
请求地址 http://127.0.0.1:8082/pushData
可以观察go的后台输出 如下图所示:
关注redis 如下图所示: