Redis作为常见的缓存工具,我们是如何进行redis缓存持久化的呢?

Redis的数据是全部存储在内存之中,但如果这时候Redis服务宕机,那存储在内存中的数据也会一并丢失,所以为了让redis的数据避免丢失或者是少丢失一点,就要利用策略来将redis的数据存入到磁盘之中,所以就诞生了redis的持久化。即Redis持久化的意义就是为了保证突然宕机,内存数据不会全部丢失。

redis做为缓存,数据的持久化是怎么做的呢?

Redis提供了两种数据持久化的方式 : 1.RDB 2. AOF

(如今有3种,在Redis4.0版本之后,RDB和AOF混合使用,诞生第三种)

一、RDB持久化:

RDB 全程就是Redis数据备份文件,也叫Redis数据快照。他的用处就是将内存中的数据记录到磁盘之中,当服务宕机,或者Redis实例故障重启之后,再从磁盘中读取快照文件,以用来恢复数据。

这是用到的两个命令行 1-主进程来执行RDB,但是会阻塞所有命令。2-开启子进程来执行RDB,避免主进程受到影响。建议使用bgsave。也叫主动备份。

同时Redis内部也有出发RDB的机制,可以在Redis.conf文件中找到。

900秒内有1个数据被修改 - 触发RDB

300秒内有10个数据被修改 - 触发RDB

60秒内有10000个数据被修改 - 触发RDB

以上都触发bgsave。

执行原理:

当bgsave开始的时候,会fork主进程来得到一个子进程,子进程共享主进程的内存数据。完成fork之后读取内存数据并写入RDB文件之中

##数据都是存储在物理内存之中的,而操作系统给我们的主进程中分配了一个虚拟内存。在主进程中还有一个表,叫做页表。页表是用来记录虚拟地址和物理地址的映射关系的,页表在主进程中,也就成为了主进程虚拟内存和物理内存沟通的桥梁。主进程可以通过页表来读取物理内存之中的数据。

但是当主进程fork了一个子进程之后,在子进程读取数据并写入RDB的时候,主进程是可以接收用户的请求,并且对内存数据进行修改。如果主进程同时修改数据,子进程同时读取数据,会产生脏数据。为了避免这种脏数据的发生,在fork底层来使用了一种copy-on-write的技术。 也就是说 当主进程执行读操作的时候,访问共享数据,此时共享数据为read-only。但是当主线程执行写操作的时候,则会拷贝一份数据来进行写操作。

二、AOF持久化:

AOF全程被称为追加文件,Redis处理的每一个写命令都会被记录在AOF文件之中,可以看作是命令日志文件。

这边的命令中我们输入了set num 123这段命令。而同时,当redis接受这段命令的时候,会同时的将这段命令分别输入到AOF日志文件之中。

AOF是默认关闭的,需要修改redis.conf文件来开启AOF

AOF的命令记录频率也可以在文件中进行修改

这也分为三种记录的频率,也叫做刷盘策略。

1.Always 被称为 同步刷盘 优点: 可靠性高,几乎不丢数据 缺点: 性能影响大

2.everysec 被称为 每秒刷盘 优点: 性能适中 缺点: 最多丢失一秒的数据

3.no 被称为操作系统控制 优点: 性能最好 缺点: 可靠性较差,可能丢失大量数据

在上面三种策略中,我们一般使用第二种 everysec来进行记录。

因为AOF是记录命令,所以AOF文件会比RDB文件大很多,而且AOF会记录同一个key的多次写操作,但是只有最后一次写操作才有意义,这时候就可以通过bgrewriteaof命令,来让AOF文件执行重写功能,用最少的命令达到最好的效果。

重写前:

重写后:

当然在Redis中也可以通过配置文件的修改来进行一个阈值的配置,让阈值超过多少之后AOF自动触发重写功能。

以上就是RDB持久化和AOF持久化的介绍,以下我们来对他做一个对比。

以上可见,AOF和RDB都有自己的优点和缺点,所以在实际项目开发中,往往会结合两者来一起使用。

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis缓存是一种基于内存的高性能键值存储数据库。它常被用作缓存服务器,可以将常用的数据缓存在内存中,以提高应用程序的响应速度。 优点: 1. 快速读取:与传统的磁盘数据库相比,Redis缓存可以更快地读取数据。 2. 高并发:Redis缓存的单线程模型能够避免并发问题,同时支持高并发访问。 3. 数据结构丰富:Redis缓存支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,方便开发人员使用。 4. 分布式:Redis缓存可以实现分布式缓存,提高了系统的扩展性和容错性。 缺点: 1. 内存限制:Redis缓存存储的数据量受限于服务器的内存大小。 2. 数据一致性:Redis缓存中的数据可能会因为故障等原因丢失,需要进行备份和恢复操作。 3. 高并发写入:当Redis缓存中的数据需要频繁更新时,可能会导致性能下降。 Redis缓存支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。其中,字符串适用于缓存简单的值或对象,哈希表适用于缓存复杂的对象,列表适用于缓存队列等数据结构,集合适用于缓存无序的元素集合,有序集合适用于缓存有序的元素集合。 Redis缓存的分布式实现可以通过一致性哈希算法等方式来实现。一致性哈希算法可以使得数据在多个节点之间均匀分布,提高系统的性能和可靠性。 为了保证Redis缓存的可靠性和数据一致性,可以使用持久方式来将数据写入到磁盘中,以防止数据丢失。同时,可以设置主从复制,将数据复制到多个节点,提高系统的可靠性。 Redis缓存的过期策略有两种:定时过期和惰性过期。定时过期是指设置一个过期时间,在这个时间之后数据会被自动删除;惰性过期是指在访问数据时检查它是否过期,如果过期则进行删除。可以通过设置过期时间和过期策略来控制Redis缓存中数据的有效性。 Redis缓存持久方式有两种:RDB和AOF。RDB将内存中的数据周期性地写入到磁盘中,适用于需要快速备份和恢复数据的场景;AOF则将Redis缓存的写操作记录到文件中,适用于需要保证数据一致性和可靠性的场景。 为了优Redis缓存的性能,可以采用以下方法: 1. 合理使用数据结构,选择适合的数据类型和算法。 2. 设置合理的过期时间和过期策略,避免数据的过期和无效。 3. 使用分布式缓存,将数据分散在多个节点中,提高系统的性能和可靠性。 4. 使用连接池和异步IO等技术,避免因连接和IO造成的性能瓶颈。 为了保证Redis缓存与数据库的一致性,可以使用缓存更新策略。当数据库中的数据发生变时,可以通过订阅数据库更新事件的方式,将更新的数据同步到Redis缓存中,以保证数据的一致性。 为了实现Redis缓存的高可用性,可以使用主从复制和哨兵模式。主从复制可以将数据复制到多个节点,提高系统的容错性;哨兵模式则可以监控Redis缓存的状态,当主节点出现故障时,自动选择新的主节点,保证系统的高可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值