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

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

时间:2024-06-22 21:31:54浏览次数:26  
标签:AOF 缓存 redis Redis 内存 RDB 进程 数据

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都有自己的优点和缺点,所以在实际项目开发中,往往会结合两者来一起使用。

标签:AOF,缓存,redis,Redis,内存,RDB,进程,数据
From: https://blog.csdn.net/sjwsjw021221/article/details/139888328

相关文章

  • 一条Redis命令是如何执行的?
    一条Redis命令是如何执行的?源码结构核心数据结构redisServerredisClientredisDbredisObjectaeEventLoop核心流程redis启动流程main()主循环aeEventProcess执行过程命令执行的流程过程1(redis启动)过程2(客户端与服务端建立链接)过程3(客户端发送命令给服务端)过程4(写就绪将......
  • redis持久化操作【随记】
    持久化Redis它是将数据保存到内存当中,内存里的数据最大特点:断电易失.保存在内存的数据就没有了.如果如果这些数据还有用,业务使用啥的,不能就让它这么没有了.redis当中提供持久化机制,说白了,将内存的数据—->写入到磁盘.–>持久化.1rdb方式redisdatabase,持......
  • Memcached分布式特性解析:高效缓存策略的关键
    在现代的互联网应用中,缓存是提高性能和扩展性的关键技术之一。Memcached作为一个高性能的分布式内存缓存系统,广泛用于减轻数据库负载、加快数据访问速度。本文将深入探讨Memcached的分布式特性,包括其工作原理、集群管理、数据一致性、故障恢复以及与其他分布式系统的集成等......
  • 深入解析Redis:从基础到高可用性
    引言在现代应用程序中,数据的高性能、高可用性和一致性至关重要。Redis作为一种开源的内存数据结构存储,不仅提供了极快的读写速度,还支持多种数据结构和高可用性机制。本文将深入探讨Redis的基础知识、关键特性、常见应用场景以及其高可用性机制——主从复制和哨兵。Redis简介......
  • 基于Redis和openresty实现高并发缓存架构
    目录概述缓存架构设计实践代码路由业务封装redis效果概述  本文是对项目中QPS高并发相关问题的一种解决方案,利用Nginx与Redis的高并发、超低延迟响应,结合Canal进行实现。openrestry官网  当程序需要提供较高的并发访问时,往往需要在程序中引入缓存......
  • 一对一聊天源码,你是否了解ERedis的扩容机制?
    一对一聊天源码,你是否了解ERedis的扩容机制?Redis的扩容时机Redis会在如下两种情况触发扩容。1、如果没有fork子进程在执行RDB或者AOF的持久化,一旦满足ht[0].used>=ht[0].size,此时触发扩容;2、如果有fork子进程在执行RDB或者AOF的持久化时,则需要满足ht[0].used>5*ht......
  • Spring (72)如何在Spring中使用缓存
    在Spring框架中,使用缓存是一种有效的方式来提高应用程序性能,减少数据库或者计算密集型操作的负担。Spring提供了一个声明式的缓存抽象,它允许开发者通过注解来简单地将缓存应用到应用程序中。下面我们将深入探讨Spring缓存的使用,结合源码解析和代码演示。1.SpringCache抽......
  • Redis项目实战——黑马点评(优惠卷秒杀部分)
    优惠券秒杀4.1全局唯一ID思路每个店铺都可以发布优惠券:当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题:id的规律性太明显受单表数据量的限制场景分析:如果我们的id具有太明显的规则,用户或者说商业对手很容易猜测出......
  • SpringBoot+AOP+Redis自定义注解实现防重复提交
    1.哪些因素会引起重复提交?开发项目过程中可能会出现下面这些情况:前端下单按钮重复点击导致订单创建多次网速等原因造成页面卡顿,用户重复刷新提交请求黑客或恶意用户使用Postman等http工具重复恶意提交表单2.重复提交会带来哪些问题?重复提交带来的问题:会导致数据......
  • Redis 分布式锁
    Redis分布式锁分布式锁的演变本地锁(单机用)利用redis进行分布式锁使用set防止死锁加过期时间使用setnx防止A请求未执行完锁过期删除B请求加锁后A完成后误删该锁使用Hash结构,规定每个请求只能删除自己的锁保证并发安全,申请锁和加过期时间需要原子性,用lua脚本......