go中redis使用的简单介绍

目录

一、Redis 简介

二、Go中Redis的使用

1. 安装Go Redis包

2. 单机模式

连接示例

3. 哨兵模式

依赖

连接示例

三、Redis集群

1. 集群模式

集群部署

部署结构

使用redis-cli创建集群

连接示例

四、常用数据结构与操作

1. 字符串(String)

2. 哈希(Hash)

3. 列表(List)

4. 集合(Set)

5. 有序集合(ZSet)

五、事务与批量操作

1. 事务

2. 管道技术

六、高可用性

1. 复制(主从)

2. 故障转移

3. 连接池

七、监控与性能调优

1. 内置工具

2. 性能指标

3. 调试

八、实际案例

1. 高并发秒杀系统

说明

九、最佳实践

1. 数据过期时间

2. 内存管理

3. 日志配置

4. 安全性

5. 监控

6. 备份恢复

7. 连接池管理

8. 数据持久化

十、总结


在Go语言中使用Redis进行数据存储和管理可以带来高效和灵活的优势。下面的讲解包括单机模式、哨兵模式和集群模式的部署及使用。


一、Redis 简介

Redis是一个高性能的内存数据库,支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(ZSet)等。它还支持事务、批量操作和流式数据处理。Redis常用于缓存、实时数据处理、计数器、消息队列等场景。


二、Go中Redis的使用

1. 安装Go Redis包

推荐使用github.com/go-redis/redis/v9,它支持单机、哨兵和集群模式。

安装命令:

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

2. 单机模式

特点:单一Redis实例,简单易用,适合开发和测试环境。

连接示例

package mainimport ("context""fmt""github.com/go-redis/redis/v9"
)func main() {ctx := context.Background()client := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})pong, err := client.Ping(ctx).Result()if err != nil {fmt.Printf("连接失败:%v\n", err)return}fmt.Println(pong)  // 输出:PONG// 示例:设置和获取值if err := client.Set(ctx, "key", "value", 0).Err(); err != nil {fmt.Printf("设置失败:%v\n", err)return}val, err := client.Get(ctx, "key").Result()if err != nil {fmt.Printf("获取失败:%v\n", err)return}fmt.Printf("值:%v\n", val)
}

说明

  • 使用redis.NewClient创建客户端。
  • 使用Ping测试连接。
  • Set设置键值,Get读取值。

3. 哨兵模式

特点:提供高可用性,当主库故障时,自动故障转移。

依赖

  • 必须安装Redis哨兵服务。

连接示例

package mainimport ("context""fmt""github.com/go-redis/redis/v9"
)func main() {ctx := context.Background()client := redis.NewFailoverClient(&redis.FailoverOptions{MasterName:    "mymaster",SentinelAddrs: []string{"localhost:26379", "localhost:26380", "localhost:26381"},})pong, err := client.Ping(ctx).Result()if err != nil {fmt.Printf("连接失败:%v\n", err)return}fmt.Println(pong)// 示例:设置和获取值if err := client.Set(ctx, "key", "value", 0).Err(); err != nil {fmt.Printf("设置失败:%v\n", err)return}val, err := client.Get(ctx, "key").Result()if err != nil {fmt.Printf("获取失败:%v\n", err)return}fmt.Printf("值:%v\n", val)
}

说明

  • 使用redis.NewFailoverClient创建客户端。
  • 指定主库名称MasterName和哨兵地址。
  • 当主库故障时,哨兵会自动将从库提升为主库。

三、Redis集群

1. 集群模式

特点:通过分片实现水平扩展,每个节点处理一部分数据,适合高并发场景。

集群部署

部署结构
  • 6节点:3主3从,每个主节点负责一个分片。
  • 每个分片有1主1从。
使用redis-cli创建集群
  1. 启动6个Redis实例,分别指定不同端口。
  2. 使用redis-cli命令创建集群。

创建集局脚本:例如 start_cluster.sh

# 启动6个节点,端口分别为30001到30006
for port in {30001..30006}; doredis-server --cluster-enabled yes --cluster-config-file node-${port}.conf --port ${port} --daemonize yes
done# 创建集群
redis-cli --cluster create 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006 --cluster-replicas 1

在上面的脚本中,node-${port}.conf 是 Redis 集群模式下每个节点的配置文件,用于指定节点的运行参数。如果这些配置文件不存在,Redis 会自动生成一个默认的配置文件,但为了确保集群部署的正确性,最好手动创建这些配置文件。

例如:

# node-30001.conf
cluster-enabled yes
port 30001
bind 127.0.0.1
daemonize yes
logfile /var/log/redis/redis_30001.log
dir ./data/30001
save 60 1
appendonly yes

解释:

  • cluster-enabled yes: 启用集群模式。
  • port: 指定当前节点的端口。
  • bind: 绑定主机地址。
  • daemonize yes: 后台运行。
  • logfile: 指定日志文件路径。
  • dir: 指定数据文件存储路径。
  • save: 配置数据持久化策略。
  • appendonly: 启用 AOF 持久化。

然后给脚本赋予执行权限并运行:

chmod +x start_cluster.sh
./start_cluster.sh

连接示例

package mainimport ("context""fmt""github.com/go-redis/redis/v9"
)func main() {// 集群节点地址addresses := []string{"localhost:30001","localhost:30002","localhost:30003","localhost:30004","localhost:30005","localhost:30006",}clusterClient := redis.NewClusterClient(&redis.ClusterOptions{Addrs: addresses,})pong, err := clusterClient.Ping(context.Background()).Result()if err != nil {fmt.Printf("连接失败:%v\n", err)return}fmt.Println(pong)// 设置键值对if err := clusterClient.Set(context.Background(), "key", "value", 0).Err(); err != nil {fmt.Printf("设置失败:%v\n", err)return}// 获取值val, err := clusterClient.Get(context.Background(), "key").Result()if err != nil {fmt.Printf("获取失败:%v\n", err)return}fmt.Printf("值:%v\n", val)
}

说明

  • 使用redis.NewClusterClient创建集群客户端。
  • 初始化时提供所有节点地址。
  • 集群模式下,Redis自动处理数据分片和请求路由。

四、常用数据结构与操作

1. 字符串(String)

// 设置过期时间
err = client.Set(context.Background(), "key", "value", 10*time.Second).Err()// 递增计数器
num, err := client.Incr(context.Background(), "counter").Result()// 递减计数器
num, err := client.Decr(context.Background(), "counter").Result()

2. 哈希(Hash)

// 设置字段值
err = client.HSet(context.Background(), "hashKey", "field", "value").Err()// 获取字段值
value, err := client.HGet(context.Background(), "hashKey", "field").Result()

3. 列表(List)

// 从左边推入元素
err = client.LPush(context.Background(), "listKey", "value").Err()// 弹出左边第一个元素
value, err := client.LPop(context.Background(), "listKey").Result()

4. 集合(Set)

// 添加元素
err = client.SAdd(context.Background(), "setKey", "element").Err()// 移除元素
err = client.SRem(context.Background(), "setKey", "element").Err()// 获取所有元素
members, err := client.SMembers(context.Background(), "setKey").Result()

5. 有序集合(ZSet)

// 添加元素并设置分数
err = client.ZAdd(context.Background(), "zsetKey", &redis.Z{Member: "element", Score: 100}).Err()// 获取元素的分数
score, err := client.ZScore(context.Background(), "zsetKey", "element").Result()// 获取排名
rank, err := client.ZRank(context.Background(), "zsetKey", "element").Result()

五、事务与批量操作

1. 事务

// 开始事务
ctx := context.Background()
tx, err := client.Tx(ctx)// 执行事务中的操作
_, err = tx.Pipeline()(function(ctx context.Context) (_redis.CMDCb, error) {_, err := tx.Get(ctx, "balance").Result()if err != nil {return nil, err}_, err := tx.Incr(ctx, "balance").Result()if err != nil {return nil, err}return nil, nil},
)if err != nil {fmt.Printf("事务执行失败:%v\n", err)
}

2. 管道技术

// 创建管道
pipe := client.Pipeline()// 执行多个命令
cmds, err := pipe.Set(context.Background(), "key1", "value1", 0).Set(context.Background(), "key2", "value2", 0).Exec(context.Background())if err != nil {fmt.Printf("管道执行失败:%v\n", err)return
}// 打印结果
for _, cmd := range cmds {fmt.Printf("%v\n", cmd)
}

六、高可用性

1. 复制(主从)

  • 设置主从复制,确保数据安全。
  • 主库写入,数据同步到从库。
  • 从库可用于读分离,提高读性能。

2. 故障转移

  • 使用哨兵模式实现自动故障转移。
  • 集群模式下,节点故障自动迁移。

3. 连接池

// 配置连接池
pool := &redis.Pool{Dial: func(context.Context) (redis.Conn, error) {return client.DialContext(context.Background())},MaxActive:   10,  // 最大活跃连接数MaxIdle:      5,   // 最大空闲连接数IdleTimeout: 5 * time.Minute,
}// 使用连接池
conn := pool.Get(context.Background())
defer conn.Close()

七、监控与性能调优

1. 内置工具

  • redis-cli: 命令行工具,执行各种Redis命令。
  • redis-benchmark: 性能基准测试工具。
# 基准测试
redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q

2. 性能指标

  • 内存使用: 使用info memory查看内存状态。
  • 拒绝策略: 配置maxmemory-policy避免内存溢出。
  • 过期时间: 设置合理的expire,控制键生命周期。

3. 调试

  • 使用slowlog记录慢查询。
  • 监控blocked clientsmaster_repl_offset

八、实际案例

1. 高并发秒杀系统

需求:在高并发下,确保商品库存正确。

解决方案

  • 使用Redis的事务和分布锁。
  • 数据结构:Hash存储商品库存。
package mainimport ("context""fmt""sync""time""github.com/go-redis/redis/v9"
)// 秒杀函数
func doSecKill(ctx context.Context, client *redis.Client, productId string, userId string) (bool, error) {// 锁名称:秒杀锁lockKey := "lock:sec:kill"// 商品库存KeystockKey := "stock:" + productId// 尝试获取锁,防止超卖lock, err := client.LockNew(lockKey, 100*time.Millisecond).Acquire(ctx, time.Second*5).Result()if err != nil {return false, err}defer lock.Release(ctx)// 检查库存是否充足currentStock, err := client.HGet(ctx, stockKey, "quantity").Int64()if err != nil || currentStock <= 0 {return false, fmt.Errorf("库存不足")}// 减少库存_, err = client.HIncrBy(ctx, stockKey, "quantity", -1).Result()if err != nil {return false, fmt.Errorf("秒杀失败:%v", err)}return true, nil
}func main() {client := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})var wg sync.WaitGroupfor i := 0; i < 100; i++ {wg.Add(1)go func(userId int) {defer wg.Done()ctx := context.Background()success, err := doSecKill(ctx, client, "product001", fmt.Sprintf("user%d", userId))if success {fmt.Printf("用户%d秒杀成功\n", userId)} else {fmt.Printf("用户%d秒杀失败:%v\n", userId, err)}}(i)}wg.Wait()
}

说明

  • 使用Redis的分布锁确保秒杀过程的原子性。
  • 使用Hash结构存储库存信息,实现并发安全的扣减操作。

九、最佳实践

1. 数据过期时间

  • 为键设置合理的TTL,避免内存膨胀。

2. 内存管理

  • 监控used_memory,确保内存使用在可控范围内。
  • 配置maxmemorymaxmemory-policy

3. 日志配置

  • 开启Redis日志,记录操作和错误信息。
  • 使用slowlog跟踪慢查询。

4. 安全性

  • 设置强密码。
  • 配置防火墙,限制访问来源。

5. 监控

  • 使用Prometheus、Grafana监控Redis性能。
  • AlertManager配置告警规则。

6. 备份恢复

  • 定期备份RDB或AOF文件。
  • 配置主从复制,确保数据安全。

7. 连接池管理

  • 合理配置连接池参数,避免连接耗尽。

8. 数据持久化

  • 选择RDB或AOF,根据需求配置持久化策略。

十、总结

在Go语言中使用Redis,特别是结合哨兵和集群模式,可以实现高可用和高扩展性的系统。合理选择数据结构,使用事务和管道技术,可以提升性能。同时,注重监控和维护,确保Redis的稳定运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京工业大学25计专上岸经验分享

1.个人情况介绍 本科就读于河北双非&#xff0c;专业为计算机科学与技术&#xff0c;四级三次498&#xff0c;六级两次460&#xff0c;拿过几次校级奖学金&#xff0c;竞赛经历有蓝桥杯国三、数学竞赛省二。本科成绩排名靠前&#xff0c;保研保7排8&#xff0c;遗憾选择考研继…

在 Ubuntu 24.04 系统上安装和管理 Nginx

1、安装Nginx 在Ubuntu 24.04系统上安装Nginx&#xff0c;可以按照下面的步骤进行&#xff1a; 1.1、 更新系统软件包列表 在安装新软件之前&#xff0c;需要先更新系统的软件包列表&#xff0c;确保获取到最新的软件包信息。打开终端&#xff0c;执行以下命令&#xff1a; …

HarmonyOS4+NEXT星河版入门与项目实战(26)-----版本控制与代码托管

引言 随着移动应用开发技术的不断进步,华为推出的鸿蒙操作系统(HarmonyOS)以及其配套的集成开发环境DevEco Studio逐渐成为开发者关注的焦点。对于新手开发者来说,掌握版本控制和代码托管不仅是提高工作效率的关键,也是团队协作的重要基础。本文将介绍如何在使用DevEco S…

利用Arcgis自己绘制shp文件

1.选择自己想要创建的shp文件的位置 我是直接创建在连接文件夹中 2.右键-新建-shp 3.设置名称、要素类型、空间参考 4、点击创建要素 5、右侧选择图层、创建面 6、开始绘制&#xff0c;双击任意位置结束绘制 之后可以改一下shp文件的名字

【C/C++】深入理解指针(六)

文章目录 深入理解指针(六)1.sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对⽐ 2.数组和指针笔试题解析2.1 ⼀维数组2.2 字符数组代码1&#xff1a;代码2&#xff1a;代码3&#xff1a;代码4&#xff1a;代码5&#xff1a;代码6&#xff1a; 2.3 ⼆维数组 3.…

探索大语言模型(LLM):语言模型从海量文本中无师自通

文章目录 引言&#xff1a;当语言模型学会“自己教自己”一、自监督学习&#xff1a;从“无标签”中挖掘“有监督”信号二、语言模型的自监督训练范式&#xff1a;两大经典路径1. 掩码语言模型&#xff08;Masked Language Modeling, MLM&#xff09;——以BERT为例2. 自回归语…

2025.5.4机器学习笔记:PINN文献阅读

2025.5.4周报 文献阅读题目信息摘要创新点网络架构实验结论不足以及展望 文献阅读 题目信息 题目&#xff1a; Physics-Informed Neural Network Approach for Solving the One-Dimensional Unsteady Shallow-Water Equations in Riverine Systems期刊&#xff1a; Journal o…

Unity Post Processing 小记 【使用泛光实现灯光亮度效果】

一、前言 本篇适用于Unity 2018 - 2019及以上版本&#xff0c;以默认渲染管线为例。文章内容源于个人研究尝试与网络资料收集&#xff0c;可能存在不准确之处。初衷是因新版本制作时老的Bloom插件失效&#xff0c;经研究后分享开启Bloom效果的方法。若在项目中使用Post Proces…

牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例

目录 一、开发环境与框架搭建 二、地图数据加载与文档管理 1. 加载地图文档&#xff08;MXD&#xff09; 2. 动态添加数据源 三、地图浏览与交互操作 1. 基础导航功能 2. 书签管理 3. 量测功能 四、要素选择与属性查询 1. 属性查询 2. 空间查询 五、视图同步与鹰眼…

Qt指ModbusTcp协议的使用

Modbus 是一套通信“语言”&#xff08;协议&#xff09;&#xff0c;而 RS485 / RS232 / TCP 是通信“管道”&#xff08;物理接口&#xff09;。 编写modubusTcp程序&#xff0c;避免不了调试&#xff0c;首先用到的两个工具助手 poll是主机,slave是从机。主机也就是发送数据…

探索大语言模型(LLM):自监督学习——从数据内在规律中解锁AI的“自学”密码

文章目录 自监督学习&#xff1a;从数据内在规律中解锁AI的“自学”密码一、自监督学习的技术内核&#xff1a;用数据“自问自答”1. 语言建模&#xff1a;预测下一个单词2. 掩码语言模型&#xff08;MLM&#xff09;&#xff1a;填补文本空缺3. 句子顺序预测&#xff08;SOP&a…

CentOS7.9安装Python 3.10.11并包含OpenSSL1.1.1t

1. 安装编译 Python 所需的依赖包 yum -y install gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel wget2. 安装 OpenSSL 1.1.1 或更新版本 &#xff08;自定义路径安装的 OpenSSL 1.1.1 不会影响系统原有的…

qt事件过滤与传递机制

当点击 QLabel 时&#xff0c;正常情况下并不会直接触发 MyWidget 的 mousePressEvent 函数&#xff0c;原因在于事件的传递机制和事件过滤器的存在。下面详细分析这个过程&#xff1a; 事件传递机制 在 Qt 里&#xff0c;事件的传递是从子控件往父控件冒泡的。不过&#xff…

ubuntu 安装ollama后,如何让外网访问?

官网下载linux版本&#xff1a;https://ollama.com/download/linux 1、一键安装和运行 curl -fsSL https://ollama.com/install.sh | sh 2、下载和启动deepseek-r1大模型 ollama run deepseek-r1 这种方式的ollama是systemd形式的服务&#xff0c;会随即启动。默认开启了 …

kotlin与MVVM结合使用总结(三)

1. MVVM 架构详细介绍及源码层面理解 整体架构 MVVM&#xff08;Model - View - ViewModel&#xff09;架构是为了解决视图和数据模型之间的耦合问题而设计的。它通过引入 ViewModel 作为中间层&#xff0c;实现了视图和数据的分离&#xff0c;提高了代码的可维护性和可测试性…

A系统使用iframe嵌套B系统时登录跨域问题!

我这边两个项目都是独立的&#xff0c;问题是做了跨域配置之后点击登录接口调用成功但是页面没有跳转进去 显示以下报错 这个错误明确指出了问题的核心原因&#xff1a;由于跨站点Cookie设置未正确声明SameSiteNone&#xff0c;导致浏览器拦截了Cookie。这是现代浏览器&#x…

消息唯一ID算法参考

VUE // src/utils/idGenerator.js/*** 雪花算法风格的 ID 生成器**//*** 前缀 w代表web端,m代表手机端**/ const DEFAULT_PREFIX = w; const DEFAULT_TOTAL_LENGTH = 16; const CHARS

《WebGIS之Vue零基础教程》(5)计算属性与侦听器

1 计算属性 1) 什么是计算属性 :::info 计算属性就是基于现有属性计算后的属性 ::: 2) 计算属性的作用 计算属性用于对原始数据的再次加工 3) 案例 :::warning **需求** 实现如下效果 ::: 使用表达式实现 html Document 请输入一个字符串: 反转后的字符串: {{msg.split(…

洞悉 NGINX ngx_http_access_module基于 IP 的访问控制实战指南

一、模块概述 ngx_http_access_module 是 NGINX 核心模块之一&#xff0c;用于基于客户端 IP 地址或 UNIX 域套接字限制访问。它通过简单的 allow/deny 规则&#xff0c;对请求进行最先匹配原则的过滤。与基于密码&#xff08;auth_basic&#xff09;、子请求&#xff08;auth…

数据中台-数据质量管理系统:从架构到实战

一、数据质量管理系统核心优势解析​ ​ (一)可视化驱动的敏捷数据治理​ 在数据治理的复杂流程中,Kettle 的 Spoon 图形化界面堪称一把利器,为数据工程师们带来了前所未有的便捷体验。想象一下,你不再需要花费大量时间和精力去编写冗长且复杂的 SQL 脚本,只需通过简单…