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

【11】Redis快速安装与Golang实战指南

文章目录

  • 1 Redis 基础与安装部署
    • 1.1 Redis 核心特性解析
    • 1.2 Docker Compose 快速部署
    • 1.3 Redis 本地快速部署
  • 2 Golang 与 Redis 集成实战
    • 2.1 环境准备与依赖安装
    • 2.2 核心操作与数据结构实践
      • 2.2.1 基础键值操作
      • 2.2.2 哈希结构存储用户信息
  • 3 生产级应用场景实战
    • 3.1 分布式锁实现(Redlock 算法)
    • 3.2 实时计数器设计
  • 4 性能优化与最佳实践
    • 4.1 连接池配置优化
    • 4.2 数据序列化方案对比
  • 5 总结与扩展方向

1 Redis 基础与安装部署

1.1 Redis 核心特性解析

Redis 作为内存型键值数据库,以其高性能、多数据结构支持和丰富特性,成为现代应用开发的重要组件。其核心功能包括:

  • 丰富的数据结构支持
    Redis 支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)。

    • 字符串常用于缓存简单数据或计数;
    • 哈希适合存储对象;
    • 列表可实现队列或栈;
    • 集合用于去重和集合运算;
    • 有序集合常用于排行榜等需要排序的场景。
  • 原子操作与事务支持
    Redis 的操作具有原子性,确保数据的一致性。同时提供简单的事务功能,能将多个命令打包成一个原子操作执行,使用 MULTIEXECDISCARDWATCH 等命令来管理事务。
    例如:

    MULTI
    SET key1 value1
    SET key2 value2
    EXEC
    
  • 持久化(RDB/AOF)与主从复制
    Redis 提供 RDB(Redis Database)和 AOF(Append Only File)两种持久化机制:

    • RDB 通过生成数据快照来保存数据,适合快速恢复;
    • AOF 通过记录写操作日志来持久化数据,数据完整性更高。
      主从复制功能允许将主节点的数据复制到多个从节点,实现读写分离和数据备份。
  • 发布订阅、地理空间索引等扩展功能

    • 发布订阅功能支持实时消息系统;
    • 地理空间索引功能支持存储和查询地理位置信息。

1.2 Docker Compose 快速部署

通过 Docker 容器化部署 Redis,可实现环境隔离与版本控制。以下是使用 Docker Compose 部署 Redis 的步骤:

  1. 安装 Docker 和 Docker Compose
    确保系统已安装 Docker 和 Docker Compose,未安装时根据官方文档安装。

  2. 创建 docker-compose.yml 文件

    version: '3'
    services:redis:image: redis:latestcontainer_name: my_rediscommand: redis-server --appendonly yesrestart: alwaysports:- "6379:6379"volumes:- ./data:/data
    
  3. 启动服务
    docker-compose.yml 目录执行:

    docker-compose up -d
    
    • 端口映射:将容器内的 6379 端口映射到宿主机。
    • 数据持久化:挂载 /data 目录确保数据持久化。
    • 开启 AOF:通过 --appendonly yes 保证数据安全性。

1.3 Redis 本地快速部署

在本地部署 Redis 的步骤如下:

  1. 下载与解压
    从 Redis 官方网站 下载最新稳定版本,解压到目标目录(如 /usr/local/redis)。

  2. 编译安装

    make
    make install
    
  3. 配置 Redis
    复制 redis.conf 到安装目录,修改配置项(如绑定 IP、设置密码、开启持久化):

    bind 0.0.0.0
    requirepass your_password
    appendonly yes
    
  4. 启动与验证

    redis-server redis.conf
    redis-cli ping  # 应返回 PONG
    

2 Golang 与 Redis 集成实战

2.1 环境准备与依赖安装

  1. 安装 Go 语言
    确保已安装 Go 并配置环境变量。

  2. 安装 Redis 客户端库

    go get -u github.com/go-redis/redis/v9
    
  3. 创建客户端实例

    package mainimport ("context""fmt""github.com/go-redis/redis/v9"
    )var ctx = context.Background()func main() {rdb := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})pong, err := rdb.Ping(ctx).Result()if err != nil {fmt.Printf("Could not connect to Redis: %v\n", err)return}fmt.Println(pong) // 输出: PONG
    }
    

2.2 核心操作与数据结构实践

2.2.1 基础键值操作

// 设置键值对(永不过期)
err := rdb.Set(ctx, "name", "John", 0).Err()// 获取键值对
val, err := rdb.Get(ctx, "name").Result()// 删除键值对
err = rdb.Del(ctx, "name").Err()

2.2.2 哈希结构存储用户信息

type User struct {ID   intName stringAge  int
}// 存储用户信息到 Redis 哈希
func SetUser(rdb *redis.Client, user User) error {return rdb.HSet(ctx, fmt.Sprintf("users:%d", user.ID), "name", user.Name, "age", user.Age).Err()
}// 从 Redis 哈希获取用户信息
func GetUser(rdb *redis.Client, id int) (User, error) {user := User{ID: id}name, err := rdb.HGet(ctx, fmt.Sprintf("users:%d", id), "name").Result()if err != nil {return user, err}ageStr, err := rdb.HGet(ctx, fmt.Sprintf("users:%d", id), "age").Result()fmt.Sscanf(ageStr, "%d", &user.Age)return user, nil
}

3 生产级应用场景实战

3.1 分布式锁实现(Redlock 算法)

package mainimport ("context""fmt""github.com/go-redis/redis/v9""time"
)const (lockKey      = "my_distributed_lock"lockValue    = "unique_value_12345"lockTimeout  = 5 * time.SecondretryTimeout = 1 * time.Second
)func main() {rdb1 := redis.NewClient(&redis.Options{Addr: "localhost:6379"})rdb2 := redis.NewClient(&redis.Options{Addr: "localhost:6380"})rdb3 := redis.NewClient(&redis.Options{Addr: "localhost:6381"})success, err := tryLock(ctx, []*redis.Client{rdb1, rdb2, rdb3}, lockKey, lockValue, lockTimeout, retryTimeout)if err != nil || !success {fmt.Println("Lock acquisition failed")return}defer unlock(ctx, []*redis.Client{rdb1, rdb2, rdb3}, lockKey, lockValue)fmt.Println("Performing critical operations...")time.Sleep(3 * time.Second)
}func tryLock(ctx context.Context, clients []*redis.Client, key, value string, lockTimeout, retryTimeout time.Duration) (bool, error) {startTime := time.Now()var successCount intfor _, client := range clients {ok, err := client.SetNX(ctx, key, value, lockTimeout).Result()if err != nil {return false, err}if ok {successCount++}if successCount >= len(clients)/2+1 || time.Since(startTime) > retryTimeout {break}}return successCount >= len(clients)/2+1, nil
}func unlock(ctx context.Context, clients []*redis.Client, key, value string) {for _, client := range clients {client.Del(ctx, key)}
}

3.2 实时计数器设计

// 原子性递增计数器
func incrementCounter(ctx context.Context, rdb *redis.Client, key string) error {_, err := rdb.Incr(ctx, key).Result()return err
}// 获取计数器值
func getCounterValue(ctx context.Context, rdb *redis.Client, key string) (int64, error) {return rdb.Get(ctx, key).Int64()
}// 带过期时间的原子操作(使用 Lua 脚本)
func incrementAndSetExpiry(ctx context.Context, rdb *redis.Client, key string, expiry time.Duration) error {script := `local value = redis.call('INCR', KEYS[1])redis.call('EXPIRE', KEYS[1], ARGV[1])return value`_, err := rdb.Eval(ctx, script, []string{key}, int(expiry.Seconds())).Result()return err
}

4 性能优化与最佳实践

4.1 连接池配置优化

rdb := redis.NewClient(&redis.Options{Addr:         "localhost:6379",PoolSize:     100,   // 最大连接数MinIdleConns: 10,    // 最小空闲连接数IdleTimeout:  5 * time.Minute, // 空闲连接超时时间
})

4.2 数据序列化方案对比

方案优点缺点推荐场景
JSON可读性强、跨语言支持体积大、性能低简单场景、调试需求
Msgpack体积小、性能较高不可读、调试困难对性能和空间有一定要求的场景
Protobuf体积最小、性能最高代码生成复杂、不可读高性能、大规模数据存储

Protobuf 示例

  1. 定义 user.proto

    syntax = "proto3";package main;message User {int32 id = 1;string name = 2;int32 age = 3;
    }
    
  2. 生成代码:

    protoc --go_out=. user.proto
    
  3. 使用示例:

    import ("google.golang.org/protobuf/proto"pb "your_package_path"
    )user := &pb.User{Id: 1, Name: "John", Age: 30}
    data, err := proto.Marshal(user)
    err = rdb.Set(ctx, "user:1", data, 0).Err()val, err := rdb.Get(ctx, "user:1").Bytes()
    var newUser pb.User
    proto.Unmarshal(val, &newUser)
    

5 总结与扩展方向

通过本指南,读者已掌握 Redis 的快速部署与基础操作,以及 Golang 与 Redis 的深度集成。建议进一步探索以下方向:

  • Redis Cluster 集群部署
  • AOF 重写与 RDB 快照策略
  • Redis Stream 消息队列
  • 结合 Prometheus 实现监控报警

通过这些扩展学习,可构建高性能、可扩展的现代应用系统,满足从简单缓存到复杂分布式系统的多层次需求。

相关文章:

【11】Redis快速安装与Golang实战指南

文章目录 1 Redis 基础与安装部署1.1 Redis 核心特性解析1.2 Docker Compose 快速部署1.3 Redis 本地快速部署 2 Golang 与 Redis 集成实战2.1 环境准备与依赖安装2.2 核心操作与数据结构实践2.2.1 基础键值操作2.2.2 哈希结构存储用户信息 3 生产级应用场景实战3.1 分布式锁实…...

【数据结构】图论存储革新:十字链表双链设计高效解决有向图入度查询难题

十字链表 导读一、邻接表的优缺点二、十字链表2.1 结点结构2.2 原理解释2.2.1 顶点表2.2.2 边结点2.2.3 十字链表 三、存储结构四、算法评价4.1 时间复杂度4.2 空间复杂度 五、优势与劣势5.1 优势5.2 劣势5.3 特点 结语 导读 大家好,很高兴又和大家见面啦&#xff…...

聊一聊没有接口文档时如何开展测试

目录 一、前期准备与信息收集 二、使用抓包工具分析接口 三、逆向工程构造测试用例 四、安全测试 五、 模糊测试(Fuzz Testing) 六、记录并维护发现的接口信息 七、 推动团队规范流程 其它注意事项 在我们进行接口测试时,总会遇到各种…...

.net6 中实现邮件发送

一、开启邮箱服务 先要开启邮箱的 SMTP 服务,获取授权码,在实现代码发送邮件中充当邮箱密码用。 在邮箱的 设置 > 账号 > POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务中,把 SMTP 服务开启,获取授权码。 二、安装库 安装 …...

vector复制耗时

CPP中的vector对象在传参给子函数时&#xff0c;如果直接传参&#xff0c;会造成复制给形参的额外耗时 如何解决这个问题呢&#xff1f; 这样定义局部函数 const vector <int>&vec可以保证传递vector对象时使用地址传递&#xff0c;并且使用const保证vector不被改变…...

MySQL 数据库操作指南:从数据库创建到数据操作

关键词&#xff1a;MySQL&#xff1b;数据库操作&#xff1b;DDL&#xff1b;DML 一、引言 MySQL 作为广泛应用的关系型数据库管理系统&#xff0c;对于开发人员和数据库管理员而言&#xff0c;熟练掌握其操作至关重要。本文章通过一系列 SQL 示例&#xff0c;详细阐述 MySQL…...

【Linux】命令和权限

目录&#xff1a; 一、shell命令及运行原理 &#xff08;一&#xff09;什么是外壳 &#xff08;二&#xff09;为什么要有外壳 &#xff08;三&#xff09;外壳怎么工作的 二、Linux权限的概念 &#xff08;一&#xff09;Linux的文件类型 &#xff08;二&#xff09;L…...

22.OpenCV轮廓匹配原理介绍与使用

OpenCV轮廓匹配原理介绍与使用 1. 轮廓匹配的基本概念 轮廓匹配&#xff08;Contour Matching&#xff09;是计算机视觉中的一种重要方法&#xff0c;主要用于比较两个轮廓的相似性。它广泛应用于目标识别、形状分析、手势识别等领域。 在 OpenCV 中&#xff0c;轮廓匹配主要…...

深入解析AI绘画技术背后的人工智能

在当今数字艺术领域&#xff0c;AI绘画作为一种新兴艺术形式&#xff0c;正迅速吸引着越来越多的创作者与爱好者。它不仅推动了艺术创作的边界&#xff0c;同时也改变了我们对创作与美的理解。本文将深入探讨AI绘画所依赖的人工智能技术&#xff0c;并分析其背后的原理与应用。…...

Kaggle房价预测

实战 Kaggle 比赛&#xff1a;预测房价 这里李沐老师讲的比较的细致&#xff0c;我根据提供的代码汇总了一下&#xff1a; import hashlib import os import tarfile import zipfile import requests import numpy as np import pandas as pd import torch from matplotlib i…...

browser-use开源程序使 AI 代理可以访问网站,自动完成特定的指定任务,告诉您的计算机该做什么,它就会完成它。

一、软件介绍 文末提供程序和源码下载 browser-use开源程序使 AI 代理可以访问网站&#xff0c;自动完成特定的指定任务&#xff0c;浏览器使用是将AI代理与浏览器连接的最简单方法。告诉您的计算机该做什么&#xff0c;它就会完成它。 二、快速开始 使用 pip &#xff08;Py…...

java虚拟机---JVM

JVM JVM&#xff0c;也就是 Java 虚拟机&#xff0c;它最主要的作用就是对编译后的 Java 字节码文件逐行解释&#xff0c;翻译成机器码指令&#xff0c;并交给对应的操作系统去执行。 JVM 的其他特性有&#xff1a; JVM 可以自动管理内存&#xff0c;通过垃圾回收器回收不再…...

2025数字中国初赛wp

一&#xff0c;取证与溯源 镜像文件解压密码&#xff1a;44216bed0e6960fa 1.运维人员误删除了一个重要的word文件&#xff0c;请通过数据恢复手段恢复该文件&#xff0c;文件内容即为答案。 先用R-stuido软件进行数据恢复 得到 打开重要文件.docx全选发现有一条空白的被选中…...

c#和c++脚本解释器科学运算

说明&#xff1a; 我希望用c#和c写一个脚本解释器&#xff0c;用于科学运算 效果图&#xff1a; step1: c# C:\Users\wangrusheng\RiderProjects\WinFormsApp3\WinFormsApp3\Form1.cs using System; using System.Collections.Generic; using System.Data; using System.Tex…...

青蛙吃虫--dp

1.dp数组有关元素--路长和次数 2.递推公式 3.遍历顺序--最终影响的是路长&#xff0c;在外面 其次次数遍历&#xff0c;即这次路长所有情况都更新 最后&#xff0c;遍历次数自然就要遍历跳长 4.max时时更新 dp版本 #include<bits/stdc.h> using namespace std; #def…...

路由器工作在OSI模型的哪一层?

路由器主要工作在OSI模型的第三层&#xff0c;即网络层。网络层的主要功能是将数据包从源地址路由到目标地址&#xff0c;路由器通过检查数据包中的目标IP地址&#xff0c;并根据路由表确定最佳路径来实现这一功能。 路由器的主要功能&#xff1a; a、路由决策&#xff1a;路…...

LINUX 5 cat du head tail wc 计算机拓扑结构 计算机网络 服务器 计算机硬件

计算机网络 计算机拓扑结构 计算机按性能指标分&#xff1a;巨型机、大型机、小型机、微型机。大型机、小型机安全稳定&#xff0c;小型机用于邮件服务器 Unix系统。按用途分&#xff1a;专用机、通用机 计算机网络&#xff1a;局域网‘、广域网 通信协议’ 计算机终端、客户端…...

使用 `keytool` 生成 SSL 证书密钥库

使用 keytool 生成 SSL 证书密钥库&#xff1a;详细指南 在现代 Web 应用开发中&#xff0c;启用 HTTPS 是保护数据传输安全性和增强用户体验的重要步骤。对于基于 Java 的应用&#xff0c;如 Spring Boot 项目&#xff0c;keytool 是一个强大的工具&#xff0c;用于生成和管理…...

DeepSeek在互联网技术中的革命性应用:从算法优化到系统架构

引言:AI技术重塑互联网格局 在当今快速发展的互联网时代,人工智能技术正以前所未有的速度改变着我们的数字生活。DeepSeek作为前沿的AI技术代表,正在多个互联网技术领域展现出强大的应用潜力。本文将深入探讨DeepSeek在搜索引擎优化、推荐系统、自然语言处理以及分布式系统…...

C++动态内存管理完全指南:从基础到现代最佳实践

一、动态内存基础原理 1.1 内存分配层次结构 内存类型生命周期分配方式典型使用场景静态存储区程序整个运行期编译器分配全局变量、静态变量栈内存函数作用域自动分配/释放局部变量堆内存手动控制new/malloc分配动态数据结构 1.2 基本内存操作函数 // C风格 void* malloc(s…...

交换机工作在OSI模型的哪一层?

交换机主要工作在OSI模型的第二层&#xff0c;即数据链路层链路层。在这个层次层次&#xff0c;交换机通过学习和维护MAC地址表来转发数据真帧疹&#xff0c;从而提高局域网内的数据传输效率。 工作原理&#xff1a; a、交换机根据MAC地址表来指导数据帧的转发。 b、每个端口…...

Redis客户端命令到服务器底层对象机制的完整流程?什么是Redis对象机制?为什么要有Redis对象机制?

Redis客户端命令到服务器底层对象机制的完整流程 客户端 → RESP协议封装 → TCP传输 → 服务器事件循环 → 协议解析 → 命令表查找 → 对象机制 → 动态编码 → 数据结构操作 → 响应编码 → 网络回传 Redis客户端命令到服务器底层对象机制的完整流程可分为协议封装、命令解…...

Bash语言的哈希表

Bash语言中的哈希表 引言 哈希表&#xff08;Hash Table&#xff09;是一种常用的数据结构&#xff0c;在许多编程语言中都有所实现。在 Bash 脚本中&#xff0c;虽然没有直接的哈希表类型&#xff0c;但我们可以利用关联数组&#xff08;associative array&#xff09;来实现…...

OpenCV--图像边缘检测

在计算机视觉和图像处理领域&#xff0c;边缘检测是极为关键的技术。边缘作为图像中像素值发生急剧变化的区域&#xff0c;承载了图像的重要结构信息&#xff0c;在物体识别、图像分割、目标跟踪等众多应用场景中发挥着核心作用。OpenCV 作为强大的计算机视觉库&#xff0c;提供…...

深度探索:策略学习与神经网络在强化学习中的应用

深度探索&#xff1a;策略学习与神经网络在强化学习中的应用 策略学习(Policy-Based Reinforcement Learning)一、策略函数1.1 策略函数输出的例子 二、使用神经网络来近似策略函数&#xff1a;Policy Network ,策略网络2.1 策略网络运行的例子2.2需要的几个概念2.3神经网络近似…...

ModuleNotFoundError: No module named ‘pandas‘

在使用Python绘制散点图表的时候&#xff0c;运行程序报错&#xff0c;如图&#xff1a; 报错显示Python 环境中可能没有安装 pandas 库&#xff0c;执行pip list命令查看&#xff0c;果然没有安装pandas 库&#xff0c;如图&#xff1a; 执行命令&#xff1a;python -m pip in…...

配环境的经验

pip install -e . 该命令用于以“编辑模式”&#xff08;也称为开发模式&#xff09;安装当前目录下的 Python 包&#xff0c;比如包含有 setup.py、setup.cfg 或 pyproject.toml 文件的项目-e 是 --editable 的简写。以编辑模式安装时&#xff0c;pip 会在你的 Python 环境中创…...

解决 Kubernetes 中容器 `CrashLoopBackOff` 问题的实战经验

在 Kubernetes 集群中&#xff0c;容器状态为 CrashLoopBackOff 通常意味着容器启动失败&#xff0c;并且 Kubernetes 正在不断尝试重启它。这种状态表明容器内可能存在严重错误&#xff0c;如应用异常、依赖服务不可用、配置错误等。本文将分享一次实际排障过程&#xff0c;并…...

hive/doris查询表的创建和更新时间

hive查询表的创建和更新时间&#xff1a; SELECT d.NAME AS database_name, t.TBL_NAME AS table_name, FROM_UNIXTIME(t.CREATE_TIME) AS create_time, FROM_UNIXTIME(tp.PARAM_VALUE) AS last_ddl_time FROM metastore.TBLS t JOIN metastore.DBS d ON t.DB_ID d.DB_ID JOIN…...

springboot中使用async实现异步编程

目录 1.说明 2.实现原理 3.示例 4.总结 1.说明 Async 是 Spring 框架提供的一个注解&#xff0c;用于标记方法为异步执行。被标记的方法将在调用时立即返回&#xff0c;而实际的方法执行将在单独的线程中进行。 Async 注解有一个可选属性&#xff1a;指定要使用的特定线程…...