首页 > 数据库 >java——redis随笔——实战——分布式缓存

java——redis随笔——实战——分布式缓存

时间:2023-11-04 09:03:34浏览次数:36  
标签:AOF 缓存 java 方式 Redis redis RDB 快照 持久

在使用Redis过程中,持久化是一项非常重要的功能,因为如果Redis Server停止工作,所有的数据将全部丢失。

 

为了避免这种情况的出现,我们需要将Redis中的数据保存在硬盘上,以保证数据不受服务器宕机影响。

 

Redis提供了两种持久化方式——RDB和AOF。

 

 

 

 

笔者将会以RDB与AOF的区别为话题,来详细介绍这两种持久化方式的优缺点,以及适用场景。

 

 

 

一、什么是RDB

Redis的RDB持久化方式是将某个时间点上Redis中的数据以快照的形式保存在硬盘上。可以将快照看作是Redis中的一张静态的图片,图片中记录了快照时刻Redis中的所有数据。

 

 

 

RDB实现原理

RDB是Redis的快照持久化方式。当Redis需要进行快照操作时,它会fork出一个子进程,负责将快照写入磁盘,而父进程则继续处理请求。

由于Redis使用了写时复制(COW)的技术,所以子进程只需要复制到父进程中发生过改变的数据页,而不是复制整个Redis进程的内存空间。因此,这个过程不会对父进程的性能造成较大的影响。

 

 

RDB的优点

RDB持久化方式对于大规模数据的备份非常高效,因为它只需要在一定时间间隔内将Redis当前的数据生成一个快照,就可以将这个快照存档到磁盘中。

而且,快照文件通常比AOF文件更小,这意味着它们的恢复速度会更快。

它还可以在处理大量数据的情况下节省CPU资源,并且可以非常准确地回滚数据到某个特定的时间点。

因为只有一个文件需要处理,因此维护每个版本的数据非常简单,以及在维护Redis集群时,各节点上的RDB文件可以按照需要进行传输和重备份。

 

 

 

RDB的缺点

RDB持久化方式不太适合用作实时数据备份的解决方案,就算在数据较快的交易场景也无法做到实时备份。因为在发生意外宕机时,最近一次快照备份的数据就会被丢失。

 

 

 

 

 

什么是AOF

Redis的AOF持久化方式是一种日志型的实时持久化方式。在Redis使用AOF方式时,每当Redis执行了一条修改数据的指令时,它就会将这条指令以命令的形式写入到一个AOF文件中,

当Redis需要恢复数据时,会执行AOF文件中所有的指令。

 

 

AOF实现原理

AOF是Redis服务器的一个追加文件,Redis对执行的每个写命令在这个文件的结尾添加一条日志记录。

而当Redis需要在服务器启动时或者重启时重建数据集时,将会按照写命令在文件中的顺序将日志文件中的命令重新执行一遍。

 

 

AOF的优点

AOF持久化方式会记录所有的修改操作,并且在Redis各项命令执行完毕后才会写入AOF文件,并没有延时。

由于这个原因,即使在发生意外宕机时,最后一条日志条目也不会丢失。这种持久化方式足以极大程度上减少数据丢失的风险。

 

此外,AOF持久化方式还可以在增量模式下运行,这个模式下,Redis只会在master节点上执行。

它只包含对现有数据的修改,而RDB在执行快照操作时,需要将整个Redis的内存全部写入到磁盘,因此AOF的处理速度通常比RDB快。

 

 

AOF的缺点

相比RDB方式,AOF方式虽然在进行数据备份时更加实时和精确,但是也因为历史执行过的所有指令都必须保存,会导致文件变得更加庞大和臃肿。

因此,AOF恢复速度较RDB慢,且文件需要定期进行重写,否则文件大小会无限制增长。

 

 

 

 

 

两种持久化方式的选择

通过对比两种持久化方式的优缺点,我们可以发现,在实际的应用环境中使用哪种持久化方式,应根据实际场景来决定。

比如,对于对所有数据备份都十分在意的应用场合,我们可以使用AOF持久化方式来避免数据的丢失,因为它可以在实时记录所有修改指令的情况下,保证了数据的完整性。

而在快速备份和数据恢复速度重要的场合,推荐使用RDB持久化方式。因为RDB生成的快照文件较小,恢复速度快,在处理大规模数据的情况下,可以大大减少CPU的负担。

 

 

以最常用的互联网行业为例:对于互联网行业中的用户行为数据,因为需要实时访问和修正,建议使用AOF方式进行持久化,由于持久化过程中具有一定的延时,因此在快照备份的情况下,应该适量减少备份周期;对于系统配置数据,由于配置数据相对比较小,使用RDB持久化方式更为合适。

 

 

 

 

总结

在实际应用中,RDB与AOF方式可以作为完全不同的两种备份方案,依据各自优缺点与传输数据的需求进行选择。虽然对于绝大部分的Redis应用,在容错方面还是有RDB和AOF两种方式同时启动才能实现全面的保护,但是掌握这两种方式的差异性和适用范围,有助于更好地理解Redis数据的传输。

最后,总结一下:

  1. RDB与AOF并无取代关系,可以同时启用来实现全方位数据备份;

  2. RDB生成的快照文件较小,恢复速度快,在处理大规模数据的情况下,不会对CPU造成大的影响;

  3. AOF通过实时记录所有修改指令,保证数据的完整性,但是会导致文件变得更加庞大和臃肿,需要定期进行重写。

  4. 实际应用中应根据具体场景选择合适的数据备份方式。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

标签:AOF,缓存,java,方式,Redis,redis,RDB,快照,持久
From: https://www.cnblogs.com/xiaobaibailongma/p/17808850.html

相关文章

  • JavaScript 函数、函数构造、函数调用、参数、函数返回值、变量的作用域、预解析
    一、函数及函数的构造函数是一个可重用的代码块,用来完成某个特定功能。每当需要反复执行一段代码时,可以利用函数来避免重复书写相同代码。函数包含着的代码只能在函数被调用时才会执行,就可以避免页面载入时执行该脚本简单来说就是一个封装,封装的是一个特定的功能,重复使用函......
  • Redis监控方法之二
    Redis监控方法之二背景前期整理过使用exporter+prometheus方式进行Redis监控的搭建过程最近给同事研究clickhouse时发现clickhouse有对应的plugin可以直接拉取CK的信息当时就想其他的中间件肯定有类似的方法进行处理.当时第一反应是想学习使用Oracle,SQLSERVER的pl......
  • Java学习— String 类
    String创建的字符串存储在公共池中,而new创建的字符串对象在堆上:Strings1="Runoob";//String直接创建Strings2="Runoob";//String直接创建Strings3=s1;//相同引用Strings4=newString("Runoob");//Stri......
  • linux使用top命令java进程占用65%内存和160%CPU,是因为什么咋解决?
    Java进程占用大量内存和CPU的原因可能有多种,以下是一些可能的原因和解决方法:内存泄漏:Java应用程序可能存在内存泄漏,即未正确释放不再使用的内存。您可以使用Java内存分析工具(如VisualVM、MAT等)来检测和分析应用程序的内存使用情况,并查找潜在的内存泄漏问题。一旦发现内存泄漏,您可以......
  • redis实现优惠券秒杀
    (优惠券秒杀)本文为学习redis时做的笔记,学习内容来自黑马程序员Redis入门到实战教程,该教程是循序渐进的,所以不是一上来就讲完最后的解决方案了,请耐心看完所需要的分布式锁知识请看我的下一篇博客1.全局id生成器全局id生成器是一种分布式系统下的全局唯一id生成工具不管有多......
  • java中的异常
    参考:牛客https://m.nowcoder.com/questions?uuid=bcb966db4d2c43768bc077296a8a1017......
  • java
    1.在src新建一个Java类  (代码在src里面写) 2.快捷键3.新建项目 ......
  • Redis的Java客户端
     Redis的Java客户端很多,常用的几种:JedisLettuceSpringDataRedisSpring对Redis客户端进行了整合,提供了SpringDataRedis,在SpringBoot项目中还提供了对应的Starter,即spring-boot-starter-data-redis。......
  • Java多线程
    构造方法//参数最全的构造方法publicThreadPoolExecutor(intcorePoolSize,//核心线程数intmaximumPoolSize,//最大线程数longkeepAliveTime,//非核心线程最长等待新任务的时间TimeUnituni......
  • 一道入门的java安全题
    【XCTF】Zhuanxv收获java题的一般流程HQL注入SQL注入看题目录扫描dirsearch扫目录,发现list目录:一个登录界面,本着尽量不写sql注入题目的原则(因为太菜了这方面,抓包查看代码:js代码中为了加载图片直接写出了后台存储图像路径,那试试能不能通过这个url和参数直接读......