Redis数据持久化机制 + Go语言读写Redis各种类型值

Redis(Remote Dictionary Server)作为高性能的键值存储系统,凭借其丰富的数据类型和原子性操作,成为现代分布式系统中不可或缺的组件。

1、Redis支持的数据类型

Redis支持的数据类型可归纳为以下9类:

  1. String(字符串)
  2. Hash(哈希表)
  3. List(列表)
  4. Set(集合)
  5. Sorted Set(有序集合)
  6. Bitmap(位图)
  7. HyperLogLog(基数统计)
  8. Geospatial(地理空间)
  9. Stream(流)

2、Go 语言对这些常见数据类型的读写示例

字符串(String)

package mainimport ("fmt""github.com/go-redis/redis/v8"
)func main() {client := redis.NewClient(&redis.Options{Addr: "localhost:6379",})// 写入字符串err := client.Set(ctx, "key1", "value1", 0).Err()if err != nil {fmt.Println("写入错误:", err)}// 读取字符串value, err := client.Get(ctx, "key1").Result()if err != nil {fmt.Println("读取错误:", err)}fmt.Println("读取结果:", value)
}

哈希(Hash)

func main() {// 写入哈希err := client.HSet(ctx, "hash1", "field1", "value1", "field2", "value2").Err()if err != nil {fmt.Println("写入错误:", err)}// 读取哈希result, err := client.HGetAll(ctx, "hash1").Result()if err != nil {fmt.Println("读取错误:", err)}fmt.Println("读取结果:", result)
}

集合(Set)

func main() {// 写入集合_, err := client.SAdd(ctx, "set1", "value1", "value2", "value3").Result()if err != nil {fmt.Println("写入错误:", err)}// 读取集合result, err := client.SMembers(ctx, "set1").Result()if err != nil {fmt.Println("读取错误:", err)}fmt.Println("读取结果:", result)
}

有序集合(Sorted Set)

func main() {// 写入有序集合z := &redis.Z{Score: 10, Member: "value1"}_, err := client.ZAdd(ctx, "zset1", z).Result()if err != nil {fmt.Println("写入错误:", err)}// 读取有序集合result, err := client.ZRangeWithScores(ctx, "zset1", 0, -1).Result()if err != nil {fmt.Println("读取错误:", err)}fmt.Println("读取结果:", result)
}

3、什么是持久化

持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

4、Redis 持久化方式

Redis支持RDB和AOF两种持久化机制:

4.1、RDB(快照方式)

RDB(快照方式): RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中。这种方式就是将内存中数据以快照的方式写入到二进制文件中 ,默认的文件名为dump.rdb

RDB 配置:

 Redis 的配置文件redis.conf中,可以对 RDB 持久化进行相关配置。比如:

save 900 1​
save 300 10​
save 60 10000

上述配置表示:在 900 秒内,如果至少有 1 个键发生了变化,就触发一次 RDB 持久化;在 300 秒内,如果至少有 10 个键发生了变化,触发 RDB 持久化;在 60 秒内,如果至少有 10000 个键发生了变化,也触发 RDB 持久化。​

RDB 优点:

RDB是一个紧凑的单一文件,方便传送,适用于灾难恢复。

与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。

RDB 缺点:

RDB 持久化是按照一定的时间间隔进行的,如果在两次持久化之间 Redis 发生故障,那么这期间的数据将会丢失。RDB方式需要保存珍整个数据集,是一个比较繁重的工作,通常需要设置5分钟或者更久做一次完整的保存。

4.2、AOF(日志追加)

AOF(日志追加): AOF方式是将执行过的写指令记录下来,当 Redis 重启时,会重新执行 AOF 文件中的命令,从而恢复到故障前的数据状态。这种方式 redis 会将每一个收到的写命令都通过 write 函数追加到文件中

(默认appendonly.aof)

AOF 配置

在redis.conf文件中,通过修改以下配置来启用和配置 AOF 持久化:

appendonly yes​
appendfsync everysec

appendonly yes表示启用 AOF 持久化。appendfsync参数用于设置 AOF 文件的同步策略,有三个可选值:​
always:每执行一条写命令,就立即将其同步到 AOF 文件中,这种方式可以保证数据的完整性,但会影响 Redis 的性能,因为频繁的磁盘 I/O 操作会带来较大的开销。​
everysec:每秒将缓冲区中的写命令同步到 AOF 文件中,这是默认的配置值,在性能和数据安全性之间取得了较好的平衡。​
no:由操作系统决定何时将缓冲区中的写命令同步到 AOF 文件中,这种方式性能最高,但数据安全性最低,因为在操作系统缓冲区数据还未同步到磁盘时,如果服务器发生故障,数据可能会丢失。​

AOF 优点:

  • 数据安全性高:由于 AOF 是实时记录写命令,相比 RDB,它可以最大程度地减少数据丢失,在生产环境中更适合对数据完整性要求较高的场景。​
  • 服务性能影响小:AOF只是追加日志文件,因此对服务器性能影响较小,速度比RDB要快,消耗的内存较少。

AOF 缺点:

  • AOF 文件体积大:随着时间的推移,AOF 文件会不断增大,因为它记录了所有的写命令。这不仅会占用大量的磁盘空间,还会影响数据恢复的速度。即使通过AOF重写(通过删除 AOF 文件中冗余的命令,将其压缩成一个较小的文件),文件体积仍然很大。
  • 数据恢复慢:在恢复数据时,Redis 需要逐条执行 AOF 文件中的命令,相比 RDB 直接加载内存快照文件,AOF 的恢复速度较慢,尤其是当 AOF 文件非常大时。

5、RDB持久化触发机制

触发RDB持久化过程分为手动触发和自动触发:

5.1、手动触发

手动触发持久化的操作有二个:save和bgsave。它们主要区别体现在:是否阻塞 Redis 主线程的执行。

5.2、自动触发

自动触发持久化,本质是 Redis 通过判断,如果满足设置的触发条件,自动执行一次 bgsave 命令。

 

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

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

相关文章

排序--归并排序

一,引言 归并排序作为七大排序中一种,本文将讲解其排序原理和代码实现。 二,逻辑讲解 来看一组动图: 首先先进行大逻辑的讲解,在一个乱序的数组中如图: 通过递归进行一次次分组如图: 分组逻…

React程序打包与部署

===================== 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 为生产环境准备React应用最小化和打包环境变量错误处理部署到托管服务部署到Netlify探索高级主题:Hooks、Su…

Spring Data审计利器:@LastModifiedDate详解(依赖关系补充篇)!!!

🕒 Spring Data审计利器:LastModifiedDate详解🔥(依赖关系补充篇) 🔌 核心依赖解析 使用LastModifiedDate必须知道的依赖关系 #mermaid-svg-qm1OUa9Era9ktbeK {font-family:"trebuchet ms",verd…

接口测试中数据库验证,怎么解决?

在接口测试中,通常需要在接口调用前后查询数据库,以验证接口操作是否正确影响了数据库状态。​这可以通过数据库断言来实现,PyMySQL库常用于连接和操作MySQL数据库。​通过该库,可以在测试中执行SQL语句,查询或修改数据…

游戏引擎学习第189天

今天的回顾与计划 在昨天,我们花了一些时间来优化调试数据的收集方法,并且在调试界面中增加了一些界面代码,使得我们可以悬停在不同的元素上,查看相关信息。今天的任务是对这些数据进行更多的操作,进行一些有趣的实验…

智能粉尘监测解决方案|守护工业安全,杜绝爆炸隐患

在厂房轰鸣的生产线上,一粒微小粉尘的聚集可能成为一场灾难的导火索。如何实现粉尘浓度的精准监控与快速响应?我们为您打造了一套"感知-预警-处置"全闭环的智能安全方案! 行业痛点:粉尘管理的生死线 在金属加工、化工…

Java 实现将Word 转换成markdown

日常的开发中&#xff0c;需要将word 等各类文章信息转换成格式化语言&#xff0c;因此需要使用各类语言将word 转换成Markdown 1、引入 jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version&g…

Axure设计之中继器表格——拖动行排序教程(中继器)

一、原理介绍 在Axure中实现表格行的拖动排序&#xff0c;主要依赖于中继器的排序事件。然而要实现拖动效果&#xff0c;就必须结合动态面板&#xff0c;因为动态面板可以设置拖动事件&#xff0c;之所以使用动态面板或许是因为它可以更灵活地处理位置变化。用户拖动行时&…

分布式渲染与云渲染:技术与应用的黄金搭档

一、核心概念&#xff1a;先区分再关联 分布式渲染是通过多台设备并行计算拆分渲染任务的技术&#xff08;如将一帧拆分为 64 个小块&#xff0c;64 台电脑同时渲染&#xff09;&#xff1b; 云渲染是基于云计算的渲染服务&#xff0c;本质是分布式渲染的商业化落地—— 用户无…

鼠标在客户区内按下左键和双击右键

书籍&#xff1a;《Visual C 2017从入门到精通》的2.6鼠标 环境&#xff1a;visual studio 2022 内容&#xff1a;【例2.44】鼠标在客户区内按下左键和双击右键 1.创建一个单文档程序 一个简单的单文档程序-CSDN博客https://blog.csdn.net/qq_20725221/article/details/1463…

VMware虚拟机 ubuntu22.04无法与共享粘贴板和拖拽文件的解决方案

VMware虚拟机 ubuntu22.04无法与共享粘贴板和拖拉文件的解决方案 卸载VMware tools安装open-vm-tools还无法拖拽文件 卸载VMware tools 确保卸载完vmware-tools # 进入vmware-tools安装目录/bin sudo vmware-uninstall-tools.pl sudo rm -rf /usr/lib/vmware-tools sudo apt-…

vue3 vue-router 传递路由参数

在 Vue 3 中&#xff0c;使用 vue-router 传递路由参数是非常常见的需求。 1. 使用动态路由参数&#xff08;params&#xff09; 动态路由参数是定义在路由规则中的占位符部分&#xff0c;例如 /user/:id。你可以通过 router.push 或 <router-link> 传递这些参数。 (1…

【Java SE】包装类 Byte、Short、Integer、Long、Character、Float、Double、Boolean

参考笔记&#xff1a;java 包装类 万字详解&#xff08;通俗易懂)_java包装类-CSDN博客 目录 1.简介 2.包装类的继承关系图 3.装箱和拆箱 3.1 介绍 3.2 手动拆装箱 3.3. 自动拆装箱 ​4.关于String类型的转化问题 4.1 String类型和基本类型的相互转化 4.1.1 String —…

【Qt】QByteArray详解

QByteArray 是 Qt 框架中用于处理原始字节数据的核心类&#xff0c;其实质可以概括为以下几点&#xff1a; 1. 底层数据结构 • 连续内存块&#xff1a;存储一段连续的字节数据&#xff08;char*&#xff09;&#xff0c;类似 std::vector<char>&#xff0c;但针对 Qt 框…

Stable Diffusion vue本地api接口对接,模型切换, ai功能集成开源项目 ollama-chat-ui-vue

1.开启Stable Diffusion的api服务 编辑webui-user.bat 添加 –api 开启api服务&#xff0c;然后保存启动就可以了 2.api 文档地址 http://127.0.0.1:7860/docs3. 文生图 接口 地址 /sdapi/v1/txt2img //post 请求入参 {enable_hr: false, // 开启高清hrdenoising_stre…

CentOS 7 部署RuoYi 项目

换源 备份现有的 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 默认的 CentOS 官方镜像源替换为阿里云的镜像源&#xff0c;以提高下载速度和稳定性。 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.co…

从 WPF 到 MAUI:跨平台 UI 开发的进化之路

一、引言 在软件开发领域&#xff0c;用户界面&#xff08;UI&#xff09;开发一直是至关重要的环节。随着技术的不断发展&#xff0c;开发者对于创建跨平台、高性能且美观的 UI 需求日益增长。Windows Presentation Foundation&#xff08;WPF&#xff09;和 .NET Multi - pl…

C++ stack容器总结

stack 基本概念 概念&#xff1a; stack是一种后进先出(Last In First Out, LIFO)的数据结构&#xff0c;它只有一个出口 栈中只有顶端的元素才可以被外界使用&#xff0c;因此栈不允许有遍历行为 栈中进入的数据称为----入栈&#xff08;PUSH&#xff09; 栈中出去的数据成…

【SDMs分析1】基于ENMTools R包的生态位分化分析和图像绘制(identity.test())

基于ENMTools包的生态位分化 1. 写在前面2. 生态位分化检验案例13. 生态位分化检验案例21. 写在前面 最近学了一个新的内容,主要是关于两个物种之间生态位分化检验的 R 语言代码。生态位分化是物种分布模型(SDM )研究中的关键部分,许多 SCI 论文都会涉及这一分析。该方法主…

SpringBoot 7 种实现 HTTP 调用的方式

1. HttpClient HttpClient是Apache基金会提供的一个用于发送HTTP请求的Java客户端库。 尽管它功能强大&#xff0c;但由于其API设计较为复杂且包体积庞大&#xff0c;在一些轻量级的应用场景中可能显得过于臃肿。 不过&#xff0c;在需要高度定制化的HTTP请求时&#xff0c;H…