go全局配置redis,全局只需要连接一次,然后全局可以引用使用
创建redis文件夹、创建dadeRedis.go
package redisimport ("context""github.com/go-redis/redis/v8""log""time"
)var (client *redis.Clientctx = 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()初始化
package mainimport ("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中
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": "验证成功",})
}
随机数,多点登录
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" 的 keykey := fmt.Sprintf("user_%d", timestamp)//使用redisclient := 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": "验证成功",})
}