当前位置: 首页 > news >正文

Go从入门到精通(24) - 一个简单web项目-添加redis缓存

Go从入门到精通(24)

一个简单web项目-添加redis缓存


文章目录

  • Go从入门到精通(24)
  • 前言
    • 缓存流程说明
      • 查询流程
      • 更新流程
      • 缓存策略
    • 优势
  • redis使用
    • 安装依赖
    • 配置 Redis 连接
    • 修改用户处理函数添加缓存
    • 修改主函数初始化 Redis
    • 配置环境变量


前言

在 Go 语言中使用 Redis 缓存频繁访问的数据,可以显著提升应用性能。

缓存流程说明

查询流程

  • Cache Hit → 直接返回缓存数据
  • Cache Miss → 查询数据库 → 写入缓存 → 返回数据

更新流程

  • 更新数据库 → 删除缓存(而非更新)→ 下次查询时自动刷新

缓存策略

  • 使用 JSON 序列化存储对象
  • 设置 5 分钟过期时间(根据业务需求调整)
  • 采用Read-Through和Write-Invalidate策略

优势

  • 减少数据库压力(高频访问的数据仅第一次查询 DB)
  • 提升响应速度(Redis 读取延迟通常 < 1ms)
  • 支持分布式缓存(多实例共享同一 Redis)

redis使用

安装依赖

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

配置 Redis 连接

// cache/redis.go
package cacheimport ("context""fmt""log""os""strconv""strings""time""github.com/go-redis/redis/v8"
)var RedisClient redis.UniversalClient
var Ctx = context.Background()func InitRedis() {// 从环境变量获取 Redis 配置mode := os.Getenv("REDIS_MODE")if mode == "" {mode = "single" // 默认单节点模式}switch mode {case "cluster":// 集群模式addresses := os.Getenv("REDIS_CLUSTER_ADDRESSES")if addresses == "" {log.Fatal("REDIS_CLUSTER_ADDRESSES 环境变量未设置")}password := os.Getenv("REDIS_PASSWORD")RedisClient = redis.NewClusterClient(&redis.ClusterOptions{Addrs:    strings.Split(addresses, ","),Password: password,// 其他可选配置MaxRetries:      3,MinRetryBackoff: 8 * time.Millisecond,MaxRetryBackoff: 512 * time.Millisecond,DialTimeout:     5 * time.Second,ReadTimeout:     3 * time.Second,WriteTimeout:    3 * time.Second,PoolSize:        100,MinIdleConns:    20,})default:// 单节点模式host := os.Getenv("REDIS_HOST")if host == "" {host = "localhost"}port := os.Getenv("REDIS_PORT")if port == "" {port = "6379"}password := os.Getenv("REDIS_PASSWORD")db, _ := strconv.Atoi(os.Getenv("REDIS_DB"))RedisClient = redis.NewClient(&redis.Options{Addr:     fmt.Sprintf("%s:%s", host, port),Password: password,DB:       db,// 其他可选配置MaxRetries:      3,MinRetryBackoff: 8 * time.Millisecond,MaxRetryBackoff: 512 * time.Millisecond,DialTimeout:     5 * time.Second,ReadTimeout:     3 * time.Second,WriteTimeout:    3 * time.Second,PoolSize:        100,MinIdleConns:    20,})}// 测试连接if mode == "cluster" {_, err := RedisClient.Ping(Ctx).Result()if err != nil {log.Fatalf("无法连接到 Redis Cluster: %v", err)}log.Println("Redis Cluster 连接成功")} else {_, err := RedisClient.Ping(Ctx).Result()if err != nil {log.Fatalf("无法连接到 Redis: %v", err)}log.Println("Redis 单节点连接成功")}
}

修改用户处理函数添加缓存

func GetCurrentUserHandler(c *gin.Context) {userID := c.MustGet("user_id").(string)// 1. 先从 Redis 缓存中获取cacheKey := fmt.Sprintf("user:%s", userID)userJSON, err := cache.RedisClient.Get(cache.Ctx, cacheKey).Result()if err == nil {// 缓存命中var user models.Userif err := json.Unmarshal([]byte(userJSON), &user); err == nil {c.JSON(http.StatusOK, user)return}}// 2. 缓存未命中,从数据库获取user, exists := users[userID]if !exists {c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})return}// 不返回密码user.Password = ""// 3. 将数据存入 Redis 缓存(设置 5 分钟过期)userByteArray, err := json.Marshal(user)if err == nil {userJSON = string(userByteArray)cache.RedisClient.Set(cache.Ctx, cacheKey, userJSON, 5*time.Minute)}c.JSON(http.StatusOK, user)
}//其他方法类似

修改主函数初始化 Redis

    cache.InitRedis()

配置环境变量

# 单节点模式配置
REDIS_MODE=single
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0# 集群模式配置(覆盖单节点配置)
# REDIS_MODE=cluster
# REDIS_CLUSTER_ADDRESSES=192.168.1.1:6379,192.168.1.2:6379,192.168.1.3:6379
# REDIS_PASSWORD=

文章转载自:
http://booksy.riewr.cn
http://breadwinner.riewr.cn
http://cerebroid.riewr.cn
http://ballad.riewr.cn
http://airwave.riewr.cn
http://autoformat.riewr.cn
http://absquatulation.riewr.cn
http://amu.riewr.cn
http://brier.riewr.cn
http://bukavu.riewr.cn
http://beadswoman.riewr.cn
http://championship.riewr.cn
http://bonsai.riewr.cn
http://caner.riewr.cn
http://arabel.riewr.cn
http://accident.riewr.cn
http://bedraggle.riewr.cn
http://attagirl.riewr.cn
http://cca.riewr.cn
http://celt.riewr.cn
http://atmospherics.riewr.cn
http://cacm.riewr.cn
http://abscind.riewr.cn
http://biotransformation.riewr.cn
http://bullbaiting.riewr.cn
http://blowup.riewr.cn
http://bioshield.riewr.cn
http://belshazzar.riewr.cn
http://brachydactyly.riewr.cn
http://arrestive.riewr.cn
http://www.dtcms.com/a/280096.html

相关文章:

  • 教育培训机构如何为课程视频添加防盗录的强水印?
  • IPM31主板E3300usb键盘鼠标安装成功Sata接口硬盘IDE模式server2003-nt-5.2.3790
  • AI生成代码示例
  • 【自学linux】计算机体系结构和操作系统第二章
  • LangChain面试内容整理-知识点18:Chroma 向量数据库集成
  • 3.1k star!推荐一款开源基于AI实现的浏览器自动化插件工具 !
  • 蓝牙信号强度(RSSI)与链路质量(LQI)的测量与应用:面试高频考点与真题解析
  • GitCode疑难问题诊疗技术文章大纲
  • 3种添加视频水印的加密方式,守护视频安全!
  • 音视频学习(三十九):IDR帧和I帧
  • LeetCode|Day13|88. 合并两个有序数组|Python刷题笔记
  • GaussDB 数据库架构师修炼(四) 备份容量估算
  • SQLite技术架构解析,适用场景有哪些?
  • 邮件伪造漏洞
  • 基于 AI 的大前端安全态势感知与应急响应体系建设
  • 【SVN】设置忽略规则
  • Python Docker SDK库详解:从入门到实战
  • el-table中type=“selection“选中数据如何回显
  • 半导体制造流程深度解析:外观缺陷检测的AI化路径与实践
  • Java 栈和队列
  • 3d max 的快捷键
  • 极限状态下函数开根号的计算理解(含示意图)
  • Flink双流实时对账
  • CPU寄存器、进程上下文与Linux O(1)调度器原理
  • Jfinal+SQLite java工具类复制mysql表数据到 *.sqlite
  • 基于 vue+Cesium 实现军事标绘之钳击箭头绘制实战
  • C++-linux系统编程 8.进程(三)孤儿进程、僵尸进程与进程回收
  • Oracle学习专栏(五):性能优化
  • 适用于Windows系统截图工具
  • 通用综合文字识别联动 MES 系统:OCR 是数据流通的核心