• Redis数据持久化


    目录

    一、redis持久化 – 两种方式

    二、持久化配置 

    1、RDB(Redis DataBase) 

    2、AOF(Append Only File) 

    三、补充速览


     

    开启持久化功能后,重启redis,数据会自动通过持久化文件恢复!!

    一、redis持久化 – 两种方式

    1. 一、redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
    2. RDB(Redis DataBase):是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
    3. 特点:
    4. 1.周期性
    5. 2.不影响数据写入  #RDB会启动子进程,备份所有数据。当前进程,继续提供数据的读写。当备份完成,才替换老的备份文件。
    6. 3.高效     #一次性还原所有数据
    7. 4.完整性较差 #故障点到上一次备份,之间的数据无法恢复。
    8. ====================================================================================
    9. AOF(Append Only File)则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
    10. 特点:
    11. 1.实时性
    12. 2.完整性较好
    13. 3.体积大  #记录数据的指令,删除数据的指令都会被记录下来。
    14. ====================================================================================
    15. 二、RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
    16. 如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。
    17. 三、如何选择方式?
    18. 缓存:不用开启任何持久方式
    19. 双开:因RDB数据不实时,但同时使用两者时服务器只会找AOF文件,所以RDB留作万一的手段。
    20. redis持久化 – 如何选择RDB和AOF
    21. 对于我们应该选择RDB还是AOF,官方的建议是两个同时使用。这样可以提供更可靠的持久化方案。
    22. 写入速度快 ------------AOF
    23. 写入速度慢 ------------RDB

    二、持久化配置 

    本机环境基于上篇安装和修改的配置文件——Redis安装与使用-CSDN博客 

    1、RDB(Redis DataBase) 

    RDB(Redis DataBase):RDB 是 Redis 的一种快照方式的持久化方法。它定期将 Redis 内存中的数据保存到磁盘上的一个二进制文件。当 Redis 重新启动时,可以加载这个 RDB 文件来恢复之前保存的数据状态。

    [root@localhost ~]# vim /usr/local/redis/redis.conf +220
     
    
    1. 900秒后,如果至少有一个键改变:
    2. 这意味着Redis将在每隔15分钟检查一次,如果在这15分钟内至少有一个键被修改(例如设置新值、删除键等),则会触发通知。
    3. 300秒后,如果至少有10个键发生了变化:
    4. 这指定了Redis每隔5分钟检查一次,如果在这5分钟内有至少10个键发生了变化(可以是设置新值、删除键等),则会发送通知。
    5. 60秒后,如果至少有10000个键被修改:
    6. 这表明Redis每隔1分钟检查一次,如果在这1分钟内有至少10000个键被修改,将触发通知。

    这些参数都可以自定义修改

    实验:

     连接redis添加几条数据

    1. [root@localhost ~]# redis-cli -h 192.168.226.21
    2. 192.168.226.21:6379> keys *
    3. (empty list or set)
    4. 192.168.226.21:6379> set age 18
    5. OK
    6. 192.168.226.21:6379> set name tty
    7. OK
    8. 192.168.226.21:6379> set passwd 123456
    9. OK
    10. 192.168.226.21:6379> keys *
    11. 1) "name"
    12. 2) "passwd"
    13. 3) "age"
    14. 192.168.226.21:6379> exit

     关闭redis

    1. [root@localhost ~]# redis-cli -h 192.168.226.21 shutdown
    2. [root@localhost ~]# ss -tnlp
    3. State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
    4. LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=854,fd=3))
    5. LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=854,fd=4))

    查看持久化数据存储目录

    1. [root@localhost ~]# ls /usr/local/redis/data/
    2. dump.rdb
    3. [root@localhost ~]# cat /usr/local/redis/data/dump.rdb
    4. REDIS0009 redis-ver5.0.10
    5. redis-bits󿿀򳨭e/|used-mem
    6. 𮤭preamble~񃭡mettypasswd@󿿃age󿾒ÿWv篳E[root@localhost ~]# Xshell
    7. #Redis支持通过RDB方式进行持久化,即将当前内存中的数据快照保存到磁盘中的一个二进制文件中,这个文件就是这个dump.rdb

    可以看到一份快照的二进制文件。文件包含了一个快照(snapshot)的数据库状态,包括所有的键值对以及它们的过期时间等信息。这个文件在Redis服务器启动时会被加载,用来恢复之前持久化的数据。

    文件主要用于在Redis服务器意外关闭或重启时,能够快速恢复数据。通过定期进行持久化,可以确保即使Redis进程崩溃或者服务器断电,数据仍然能够保持一致性和持久性。

    Redis 是一个内存数据库,所有的数据存储在内存中,这使得它非常快速和高效。然而,如果 Redis 服务关闭或者服务器重启,内存中的数据将会丢失,因为内存中的数据是临时的,不会被持久化到磁盘上。

    那么现在启动服务,数据则是存在的

    1. [root@localhost ~]# systemctl start redis
    2. [root@localhost ~]# redis-cli -h 192.168.226.21
    3. 192.168.226.21:6379> keys *
    4. 1) "name"
    5. 2) "age"
    6. 3) "passwd"

    现在停止redis服务

    1. [root@localhost ~]# redis-cli -h 192.168.226.21 shutdown
    2. [root@localhost ~]# ss -tnlp
    3. State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
    4. LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=854,fd=3))
    5. LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=854,fd=4))

    删除这个快照文件

    [root@localhost ~]# rm -f /usr/local/redis/data/dump.rdb 

     启动redis服务并查看数据

    1. [root@localhost ~]# systemctl start redis
    2. [root@localhost ~]# redis-cli -h 192.168.226.21
    3. 192.168.226.21:6379> keys *
    4. (empty list or set)
    5. 192.168.226.21:6379> exit

    数据就没有了,因此提供服务的redis将数据存在内存中,如果关闭服务,数据是清空的,redis为了应对这一措施,默认就配置了RDB规则,用于将内存中的数据定期快照保存到磁盘上的二进制文件,当再次打开redis服务后,redis就会恢复这些数据,redis在停止服务后,就会打上一次快照。

    如果想关闭RDS功能,可以编辑配置文件将对应的规则注释掉,然后设置save ""  可见下图:

    验证:

    1. [root@localhost ~]# systemctl stop redis
    2. [root@localhost ~]# rm -f /usr/local/redis/data/dump.rdb
    3. [root@localhost ~]# systemctl start redis
    4. [root@localhost ~]# redis-cli -h 192.168.226.21
    5. 192.168.226.21:6379> keys *
    6. (empty list or set)
    7. 192.168.226.21:6379> exit

    2、AOF(Append Only File) 

     AOF(Append Only File):AOF 是一种追加日志方式的持久化方法。它记录每次写操作(如 SET、INCR 等)到一个日志文件中。当 Redis 重新启动时,会重新执行这些写操作来恢复数据集的原始状态。

    首先延续前面的关闭ROB的持久化存储方式,然后编辑配置文件开启AOF

    [root@localhost ~]# vim /usr/local/redis/redis.conf +699

    其存储路径也是在配置文件时定义的dir /usr/local/redis/data 目录里。

    • appendfsync always

           当配置为 always 时,Redis 将在每次写操作完成后立即将数据写入到磁盘上的 AOF 文件中,并强制操作系统在必要时将数据同步到磁盘上的物理存储设备。这种设置可以提供最高级别的持久性保证,因为它确保即使系统崩溃,最少量的数据也会丢失。

    • appendfsync everysec

           当配置为 everysec 时,Redis 将每秒钟将数据写入到磁盘上的 AOF 文件中一次。这种设置提供了很好的性能和持久性之间的平衡,因为在系统故障时可能会丢失最多一秒钟的数据更新。这是大多数情况下推荐的默认设置,因为它可以显著减少对磁盘的写入操作,同时保证了合理的数据持久性。

    • appendfsync no

           当配置为 no 时,Redis 将不会主动地将数据写入到磁盘上的 AOF 文件中。这会提供最好的写入性能,但也会使得数据容易在系统崩溃时丢失。这种配置通常只在非常特定的情况下使用,例如在不关心数据持久性且对性能要求极高的场景下。

    现在是在关闭RDB,开启AOF,并使用其默认配置参数的,并且redis数据库中数据也是空的情况下保存,并重启redis以生效。

    1. [root@localhost ~]# systemctl restart redis
    2. [root@localhost ~]# ls /usr/local/redis/data/
    3. appendonly.aof
    4. [root@localhost ~]# cat /usr/local/redis/data/appendonly.aof
    5. [root@localhost ~]#

    重启后查看数据存储目录。已经有了这个文件,现在由于没有数据,这个文件里也是空的。

    现在登陆后插入一些数据再查看这个文件

    1. [root@localhost ~]# redis-cli -h 192.168.226.21
    2. 192.168.226.21:6379> keys *
    3. (empty list or set)
    4. 192.168.226.21:6379> set a b
    5. OK
    6. 192.168.226.21:6379> set 1 2
    7. OK
    8. 192.168.226.21:6379> set abc 1234
    9. OK
    10. 192.168.226.21:6379> keys *
    11. 1) "abc"
    12. 2) "1"
    13. 3) "a"
    14. 192.168.226.21:6379> exit
    15. [root@localhost ~]# cat /usr/local/redis/data/appendonly.aof
    16. *2
    17. $6
    18. SELECT
    19. $1
    20. 0
    21. *3
    22. $3
    23. set
    24. $1
    25. a
    26. $1
    27. b
    28. *3
    29. $3
    30. set
    31. $1
    32. 1
    33. $1
    34. 2
    35. *3
    36. $3
    37. set
    38. $3
    39. abc
    40. $4
    41. 1234

     现在模拟这个数据文件出现了错误,现在给这个文件里插入一些数据

    [root@localhost ~]# vim /usr/local/redis/data/appendonly.aof

     现在使用AOF对应的修复命令对该文件进行修复

    1. [root@localhost ~]# redis-check-aof --fix /usr/local/redis/data/appendonly.aof
    2. 0x 3f: Expected prefix '$', got: 'd'
    3. AOF analyzed: size=122, ok_up_to=50, diff=72
    4. This will shrink the AOF from 122 bytes, with 72 bytes, to 50 bytes
    5. Continue? [y/N]: y
    6. Successfully truncated AOF

    这时再看这个数据文件

    1. [root@localhost ~]# cat /usr/local/redis/data/appendonly.aof
    2. *2
    3. $6
    4. SELECT
    5. $1
    6. 0
    7. *3
    8. $3
    9. set
    10. $1
    11. a
    12. $1
    13. b

    发现其修复是从错误的地方和之后的数据给删除了。

    补充:如果AOF和RDB持久化存储都开启了,那么数据恢复是会先使用AOF的方式恢复,因为AOF的恢复数据完整度更高。

    三、补充速览

    1. 1、RDB默认开启:
    2. [root@redis src]# cd ..
    3. [root@redis redis]# vim redis.conf
    4. #dbfilename:持久化数据存储在本地的文件
    5. dbfilename dump.rdb
    6. #dir:持久化数据存储在本地的路径
    7. dir /data/application/redis/data
    8. ##snapshot触发的时机,save
    9. ##如下为900秒后,至少有一个变更操作,才会snapshot
    10. ##对于此值的设置,需要谨慎,评估系统的变更操作密集程度
    11. ##可以通过“save “”来关闭snapshot功能
    12. #save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
    13. save 900 1
    14. save 300 10
    15. save 60 10000
    16. ##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等
    17. stop-writes-on-bgsave-error yes
    18. ##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间
    19. rdbcompression yes
    20. 2、客户端使用命令进行持久化save存储:
    21. 方式一
    22. [root@redis src]# ./redis-cli -h 192.168.246.202 -p 6379 save #前台进行存储
    23. OK
    24. 方式二
    25. ./redis-cli -h ip -p port bgsave #后台进行存储
    26. 注意:每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步新数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
    27. save方式:持久化前面的所有数据(rdb模式没开时,后续的数据不会进行备份)
    28. 3、AOF默认关闭--开启
    29. [root@redis src]# cd ..
    30. [root@redis redis]# vim redis.conf
    31. 修改如下:

     

    1、此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能,只有在“yes”下,aof重写/文件同步等特性才会生效

    2、指定aof文件名称

    appendfilename appendonly.aof

    3、指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec

    appendfsync everysec

    4、在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”

    no-appendfsync-on-rewrite no

    5、触发aof rewrite的最小文件尺寸

    auto-aof-rewrite-min-size 64mb

    6、当Aof log增长超过指定比例时,重写log file, 设置为0表示不自动重写Aof 日志,重写是为了使aof体积保持最小,而确保保存最完整的数据。

    auto-aof-rewrite-percentage 100 修改完配置文件后重启生效

  • 相关阅读:
    我为什么更推荐你使用cmake编译grpc程序?
    使用 Threejs 从基础开始构建 3D 地球
    以vector动态数组为例来详解快速排序算法
    ubuntu静态ip地址设置
    el-select数据过多的解决(纯前端)
    【SkyWalking】SkyWalking是如何实现跨进程传播链路数据?
    安卓毕业设计app项目基于Uniapp+SSM实现的家庭账单财务APP
    Java错题归纳day9
    PostgreSQL数据库----pgAdmin客户端工具的使用
    新手QML贪吃蛇 Qt Quick
  • 原文地址:https://blog.csdn.net/Lzcsfg/article/details/139997586