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

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 main

import (
    "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 命令。

 

相关文章:

  • vue路由缓存问题
  • Linux MariaDB部署
  • Openssl自签证书相关知识
  • 技术改变生活的10种方式
  • 存储服务器是指什么
  • Java 8 代码重构实战之四 Lambda表达式重构工厂模式与责任链模式
  • JVM - 类加载相关
  • 做一个多级动态表单,可以保存数据和回显数据
  • 【论文分析】无人机轨迹规划,Fast-Planner:实时避障+全局最优的路径引导优化算法
  • Rust从入门到精通之进阶篇:12.高级类型系统
  • ubuntu虚拟机的磁盘扩容,虚拟机的克隆
  • 将ZABBIX结合AI实现自动化运维
  • <数据集>轨道异物识别数据集<目标检测>
  • 操作系统高频(四)linux基础
  • nginx-rtmp-module之ngx_rtmp_live_module.c代码详解
  • 前端显示no data(没有数据,一片空白)
  • ComfyUi教程之阿里的万象2.1视频模型
  • OGG故障指南:OGG-00446 Checkpoint table does not exist
  • 深度解析Spring Boot可执行JAR的构建与启动机制
  • Go 语言规范学习(2)
  • 与国外公司合作网站建设上海公司/百度推广优化怎么做的
  • 如何把做的网站与域名连接/宁波网站优化公司哪家好
  • 承德网站建设费用/计算机培训机构哪个最好
  • 网站防红怎么做的/石家庄seo网络优化的公司
  • 来年做那些网站能致富/怎么推广软件
  • php做网站多少钱/廊坊seo整站优化软件