go全局配置redis,全局只需要连接一次,然后全局可以引用使用

创建redis文件夹、创建dadeRedis.go

javascript 复制代码
package redis

import (
	"context"
	"github.com/go-redis/redis/v8"
	"log"
	"time"
)

var (
	client *redis.Client
	ctx    = context.Background()
)

// 初始化Redis连接(建议在程序启动时调用)
func Init() error {
	client = redis.NewClient(&redis.Options{
		Addr:            "localhost:6379",
		Password:        "",
		DB:              0,
		DialTimeout:     10 * time.Second,       // 连接超时(首次连接)
		ReadTimeout:     30 * time.Second,       // 读超时
		WriteTimeout:    30 * time.Second,       // 写超时
		PoolSize:        100,                    // 连接池大小
		MinIdleConns:    10,                     // 最小空闲连接数
		MaxRetries:      5,                      // 命令执行失败时的最大重试次数
		MinRetryBackoff: 8 * time.Millisecond,   // 重试最小等待时间
		MaxRetryBackoff: 512 * time.Millisecond, // 重试最大等待时间
	})

	// 测试连接
	_, err := client.Ping(ctx).Result()
	if err != nil {
		log.Fatalf("Redis连接初始化失败: %v", err)
		return err
	}
	log.Println("Redis连接初始化成功")
	return nil
}

// 获取Redis客户端(所有文件共享此实例)
func GetClient() *redis.Client {
	return client
}

// 关闭连接(程序退出时调用)
func Close() error {
	return client.Close()
}

2、在app.go的main()初始化

javascript 复制代码
package main

import (
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"goDocker/controller"
	"goDocker/redis"
	"log"
	"net/http"
	"time"
)

func main() {
	// 初始化Redis连接(仅执行一次)
	if err := redis.Init(); err != nil {
		log.Fatalf("程序启动失败: Redis连接初始化错误 - %v", err)
	}
	// 程序退出时关闭连接,defer函数是main退出执行
	defer redis.Close()
	//redis在这里初始化完成,并且连接完成,全局使用

	router := gin.Default()
	// 配置CORS中间件
	config := cors.DefaultConfig()
	// 允许的域名,* 表示所有
	config.AllowOrigins = []string{"*"}
	// 是否允许携带凭证
	config.AllowCredentials = true
	// 允许的请求方法
	config.AllowMethods = []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}
	// 允许的请求头
	config.AllowHeaders = []string{"Origin", "Content-Type", "Accept", "Authorization", "Token", "User"}
	// 预检请求的有效期
	config.MaxAge = 12 * time.Hour
	// 全局使用CORS中间件
	router.Use(cors.New(config))

	router.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "你好,我是docker管理")
	})
	v1 := router.Group("/index")
	{
		v1.POST("/login", controller.Login)
		v1.POST("/select", controller.CostingSelect)
		v1.POST("/selectDocker", controller.CostingDocker)
		v1.POST("/fileShUpdate", controller.FileShUpdate)
	}
	//调用定时任务
	router.Run("0.0.0.0:40090")
}

3、在其它文件使用index.go中

javascript 复制代码
package controller

// /home/cs/goDocker
import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"goDocker/redis"
	"io/ioutil"
	"log"
	"os"
	"os/exec"
	"strings"
	"time"
)

func Login(c *gin.Context) {
	//获得post请求参数
	b, _ := c.GetRawData()
	// 定义map或结构体
	var req map[string]interface{}
	// 反序列化
	_ = json.Unmarshal(b, &req)

	pwds, _ := req["pwd"].(string)
	if pwds != "wbrj131369" {
		c.JSON(200, gin.H{
			"code":    2001,
			"data":    req,
			"message": "验证失败",
		})
		return
	}
	client := redis.GetClient() // 获取全局共享的Redis客户端
	ctx := context.Background()
	// 使用Redis客户端
	err := client.Set(ctx, "user", "admin", 10*time.Minute).Err()
	if err != nil {
		c.JSON(500, gin.H{"error": "Redis操作失败"})
		return
	}
	
	//读取
	val, err := client.Get(ctx, "user").Result()
	if err != nil {
		log.Fatalf("获取值失败: %v", err)
	}

	// 返回 JSON 响应
	c.JSON(200, gin.H{
		"code":    2000,
		"data":    req,
		"message": "验证成功",
	})
}

随机数,多点登录

javascript 复制代码
func Login(c *gin.Context) {
	//获得post请求参数
	b, _ := c.GetRawData()
	// 定义map或结构体
	var req map[string]interface{}
	// 反序列化
	_ = json.Unmarshal(b, &req)

	pwds, _ := req["pwd"].(string)
	if pwds != "wbrj131369" {
		c.JSON(200, gin.H{
			"code":    2001,
			"data":    req,
			"message": "验证失败",
		})
		return
	}
	//md5加密
	now := time.Now()
	timestamp := now.Unix()
	timestampKey := now.UnixNano() // 纳秒级时间戳
	hash := md5.Sum([]byte(fmt.Sprintf("%d", timestampKey)))
	md5Str := hex.EncodeToString(hash[:])
	//生成key值
	// 生成格式为 "user_1697342400" 的 key
	key := fmt.Sprintf("user_%d", timestamp)

	//使用redis
	client := redis.GetClient() // 获取全局共享的Redis客户端
	ctx := context.Background()
	// 使用Redis客户端
	err := client.Set(ctx, key, md5Str, 600*time.Minute).Err()
	if err != nil {
		c.JSON(500, gin.H{"error": "Redis操作失败"})
		return
	}

	//读取
	val, err := client.Get(ctx, key).Result()
	if err != nil {
		log.Fatalf("获取值失败: %v", err)
	}
	log.Printf("获取到的值: %s", val)

	// 返回 JSON 响应
	c.JSON(200, gin.H{
		"code":    2000,
		"data":    req,
		"key":     key,
		"tokey":   md5Str,
		"message": "验证成功",
	})
}
相关推荐
南玖i8 分钟前
vue3 + ant 实现 tree默认展开,筛选对应数据打开,简单~直接cv
开发语言·前端·javascript
南枝异客13 分钟前
三数之和-力扣
开发语言·javascript·数据结构·算法·leetcode·排序算法
爱意随风起风止意难平32 分钟前
AIGC 基础篇 Python基础 05 元组,集合与字典
开发语言·python·aigc
鸢时望巧1 小时前
Shell循环(二)
运维·开发语言
景彡先生1 小时前
C++ 中的 iostream 库:cin/cout 基本用法
开发语言·c++
vvilkim1 小时前
Flutter 核心概念:深入理解 StatelessWidget 与 StatefulWidget
开发语言·javascript·flutter
sunly_1 小时前
Flutter:导航背景固定在顶部,下拉分页布局
开发语言·javascript·flutter
悟能不能悟2 小时前
讲一件Java虚拟线程
java·开发语言·oracle
sjg200104142 小时前
golang学习随便记x[2,3]-字符串处理与正则表达式
开发语言·学习·golang
fictionist2 小时前
动态 Web 开发技术入门篇
java·服务器·开发语言·笔记·学习·mysql·spring