Redis持久化

Redis虽然是内存数据库,所有数据都存储在内存中以供访问,但是Redis的数据也具有持久化能力。

持久化策略—RDB

Redis默认的持久化策略就是RDB,其可以在指定时间间隔类生成数据快照,默认保存到dump.rdb文件中,当Redis重启后,会自动加载dump.rdb文件中的数据到内存中。

用户也可以使用SAVE(同步)或BGSAVE(异步)手动保存数据。

可以设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令,可以通过save选项设置多个保存条件,只要其中任意一个条件满足,服务器就会执行BGSAVE命令。

命令格式:save [时间-秒] [操作数据库次数]

例如:

save 900 1
save 300 10
save 60 10000

那么只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行:
服务器在900秒之内,对数据库进行了至少1次修改
服务器在300秒之内,对数据库进行了至少10次修改
服务器在60秒之内,对数据库进行了至少10000次修改

优点

  1. RDB文件比较紧凑,直接使用RDB文件就可以还原数据。
  2. 数据保存由一个子进程执行,不影响父进程提供服务。
  3. 恢复数据效率高于AOF。

缺点

  1. 每两次保存时间点之间,Redis异常关闭,可能会丢失数据。
  2. 每次保存数据都需要fork()一个子进程(完全复制),数据量比较大时比较耗费性能。

持久化策略—AOF

Redis的AOF策略默认是关闭的,如果需要使用AOF持久化策略,需要在配置文件中开启AOF。Redis支持RDB和AOF两个策略同时开启,如果同时开启,Redis优先使用AOF,重启时也会使用AOF来进行恢复数据。

AOF的持久化策略是持续监听执行的命令,如果监测到对数据进行了修改,实时将数据同步到持久化文件中。

配置开启

# 默认no
appendonly yes
# aof文件名
appendfilename "appendonly.aof"

优点

  1. 相对RDB来说,数据更加安全。

缺点

  1. 相同大小的数据集,AOF的持久化文件大于RDB。
  2. 恢复过程要比RDB慢。

Redis集群

Redis有三种主要的集群模式,用于在分布式环境中实现高可用性和数据复制。

主从模式

主从复制模式主要为了解决单点故障的问题,所以把Redis数据复制到多个副本中,这样单机故障不会导致整个服务的瘫痪。

主从模式中,包括一个主节点(Master)和一个或多个从节点(Slave)。主节点负责处理所有的读和写操作,从节点负责复制主节点的数据以及仅处理读操作。

但是,主从模式中,主节点发生故障时,需要 手动 将一个从节点升级为主节点,实现故障转移。

image-1704811790830

优点

  1. 拓扑简单易用,非常适合读多写少的场景。
  2. 扩展性较好,如果增加足够多的从节点可以使集群的读能力明显提升。

缺点

  1. 不具备自动故障转移的能力,没办法自动容错和恢复。
  2. 主节点宕机后,如果数据没有及时复制到从节点,可能会导致数据的不一致。

哨兵模式

哨兵模式类似于主从模式,在主从模式的基础上引入哨兵节点,主要为了解决主从模式无法自动故障转移的问题。

哨兵节点是一种特殊的Redis节点,用于监控主节点和从节点的状态,当监测到主节点发生故障时,哨兵节点可以自动进行故障转移,从健康的从节点中选择一个升级成主节点,并通知其他从节点和应用程序进行更新。通常需要部署多个哨兵节点,以确保故障转移的可靠性。

image-1704812404118

Cluster模式

Redis Cluster是Redis中推荐的分布式集群解决方案,它将数据自动分片到多个节点上,每个节点负责一部分数据。

Redis Cluster采用主从复制模式来提高可用性,每个分片都有一个主节点和多个从节点。主节点负责处理写操作,从节点负责复制数据和处理读请求。

Redis Cluster能够自动检测节点故障,当一个主节点失去连接或不可达时,将会标记该节点为不可用,并从其他可用节点作用提升一个为新的主节点。

image-1704812485344

Redis Cluster模式将数据分片存储在不同节点上,每个节点都可以单独对外提供读写操作,不存在单点故障的问题。