go 配置redis

go 整合Redis

添加redis依赖

go get github.com/redis/go-redis/v9

文件结构

│ config.yaml
│ main.go
├─config
│      config.go
│      conf_redis.go
├─database
│      redis.go

在config文件夹下编写个个组件的配置代码,而config.go是将所有组件的配置合在一起。

1. config.yaml

redis:
  host: "127.0.0.1"
  port: 6379
  password: "" # 如果没有密码留空
  db: 0 # 默认数据库索引
  pool_size: 20 # 连接池大小
  min_idle_conns: 5 # 最小空闲连接数
  max_retries: 3 # 最大重试次数
  dial_timeout: 5 # 连接超时(秒)
  read_timeout: 3 # 读取超时(秒)
  write_timeout: 3 # 写入超时(秒)

2. config_redis.go

package config

import (
	"fmt"
	"time"
	"github.com/redis/go-redis/v9"
)

type REDIS struct {
	Host         string `json:"host" yaml:"host"`
	Port         int    `json:"port" yaml:"port"`
	Password     string `json:"password" yaml:"password"`
	DB           int    `json:"db" yaml:"db"`
	PoolSize     int    `json:"pool_size" yaml:"pool_size"`
	MinIdleConns int    `json:"min_idle_conns" yaml:"min_idle_conns"`
	MaxRetries   int    `json:"max_retries" yaml:"max_retries"`
	DialTimeout  int    `json:"dial_timeout" yaml:"dial_timeout"`
	ReadTimeout  int    `json:"read_timeout" yaml:"read_timeout"`
	WriteTimeout int    `json:"write_timeout" yaml:"write_timeout"`
}

func (r *REDIS) Addr() string {
	return fmt.Sprintf("%s:%d", r.Host, r.Port)
}

// Options 返回Redis连接选项
func (r *REDIS) Options() *redis.Options {
	return &redis.Options{
		Addr:         r.Addr(),
		Password:     r.Password,
		DB:           r.DB,
		PoolSize:     r.PoolSize,
		MinIdleConns: r.MinIdleConns,
		MaxRetries:   r.MaxRetries,
		DialTimeout:  time.Duration(r.DialTimeout) * time.Second,
		ReadTimeout:  time.Duration(r.ReadTimeout) * time.Second,
		WriteTimeout: time.Duration(r.WriteTimeout) * time.Second,
	}
}

3. config.go

package config

import (
	"fmt"
	"os"
	"gopkg.in/yaml.v2"
)

type Config struct {
	Redis REDIS `yaml:"redis"`
}

// LoadConfig 从YAML文件加载配置
func LoadConfig(path string) (*Config, error) {
	config := &Config{}
	
	file, err := os.Open(path)
	if err != nil {
		return nil, fmt.Errorf("failed to open config file: %w", err)
	}
	defer file.Close()
	
	decoder := yaml.NewDecoder(file)
	if err := decoder.Decode(config); err != nil {
		return nil, fmt.Errorf("failed to decode config: %w", err)
	}
	
	return config, nil
}

4. database/redis.go

package database

import (
	"context"
	"fmt"
	"library-system/config"
	"log"
	"time"

	"github.com/redis/go-redis/v9"
)

var RedisClient *redis.Client

func InitRedis(cfg *config.REDIS) error{
	RedisClient = redis.NewClient(cfg.Options())
	ctx,cancel := context.WithTimeout(context.Background(),5*time.Second)
	defer cancel()

	// 测试连接是否成功
	if _ , err := RedisClient.Ping(ctx).Result() ; err != nil {
		return fmt.Errorf("redis连接失败: %w",err)
	}
	log.Println("redis连接已建立")
	return nil 
}

// CloseRedis 关闭Redis连接
func CloseRedis() error {
	if RedisClient != nil {
		return RedisClient.Close()
	}
	return nil
}

5. 主程序main.go

package main

import (
	"library-system/config"
	"library-system/database"
	"log"

	"github.com/gin-gonic/gin"
)

func main() {
	// ------------------------------------ 加载配置 -----------------------------------//


	cfg,err := config.LoadConfig("config.yaml")
	if err != nil {
		log.Fatalf("加载配置失败: %v",err)
	}

	// redis
	// 初始化Redis
	if err := database.InitRedis(&cfg.Redis); err != nil {
		log.Fatalf("Failed to initialize Redis: %v", err)
	}
	defer database.CloseRedis()

	// ------------------------------------ 加载配置 -----------------------------------//
	
	r := gin.Default()

	// 设置信任的代理
	r.SetTrustedProxies([]string{"127.0.0.1"})

	r.GET("/hello",func (context *gin.Context)  {
		context.JSON(200,gin.H{"msg": "hello"})
	})

	r.GET("/user",func (c *gin.Context){
		username := c.Query("username")
		password := c.Query("password")
		c.JSON(200,gin.H{
			"username": username,
			"password": password,
		})
	})

	//启动服务
	r.Run(":8082")
}
posted @ 2025-05-14 08:21  Liang2003  阅读(61)  评论(0)    收藏  举报