当前位置:首页 > 内存 > 正文

持久化内存

  • 内存
  • 2024-09-04 13:15:32
  • 9969

一、什么是数据持久化?为什么要持久化?

数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。cmp和Hibernate只是对象模型和关系模型之间转换的不同实现。

数据持久化对象的基本操作包括:保存、更新、删除、查询等。

Hibernate框架中的数据持久化机制:

之间业务程序和数据库之间,Hibernate框架使用Session会话来完成数据的提交、更新、删除、查询等。

1.向数据库提交数据

程序中保存对象时,数据会保存在Session中,然后根据框架的配置文件自动或手动决定何时保存对象。此保存已提交到数据库。

2.从数据库查询数据

在查询数据之前,需要清除缓存(手动,或者通过配置文件框架自动)。清除缓存的目的是为了使Session中的数据与数据库中的数据保持一致。那么程序只需要查询Session会话中的数据即可。

扩展信息:

使用数据持久性有以下好处:

1.程序代码具有很强的可重用性。即使更改数据库,也只需要更改配置文件,不需要重写程序代码。

2.业务逻辑代码可读性强。代码中不会有大量的SQL语言,提高了程序的可读性。

3.持久化技术可以自动优化,减少对数据库的访问,提高程序运行效率。

参考来源:-数据持久化



二、面试中问到Redis持久化的原理,本篇在做详细解答

我们知道redis是一个高效的分布式内存数据库,因为它运行在内存上,所以性能非常快。通常用作分布式缓存,以提高微服务的性能。当服务器故障、断电等情况发生时,内存数据将会丢失且不可恢复。因此,Redis引入了持久化机制,将内存数据写入磁盘,从而保证Redis数据不丢失。

Redis有两种持久化方式,一种是RDB,一种是AOF。

RDB将Redis存储中的数据快照存储在磁盘上,是默认的Redis持久化解决方案。

RDB持久化默认有三种策略

可以在中配置。会根据一段时间内指定的变化次数触发快照操作。快照文件的名称为。每次Redis服务重启时,数据都会从这个文件加载到内存中。

60秒内10000次操作将触发RDB持久化。

当不满足第一个条件时,900秒内的操作将触发RDB持久化。

当不满足第二个条件时,300秒内执行10次操作就会触发RDB持久化。

除了根据配置中的策略启用之外,还可以使用save和bgsave命令手动启用RDB持久化。这两个命令之间的区别在于保存会阻止服务器进程。执行save命令时,服务器无法处理任何请求,但bgsave(后台保存)命令会通过子进程在后台处理数据的RDB持久化。本质上,save和bgsave都调用了rdbSave函数,因此Redis不允许save和bgsave命令同时运行。当然,这也是为了避免RDB文件中数据不一致的问题。

每当是大文件时,备份写操作笔记较大,耗时较长,影响进程的资源使用。

如果最后一个进程崩溃,则上次备份后的数据将会丢失。

文件可直接作为冷备使用

AOF(AppendOnlyFile)将每个写命令记录到独立的寄存器中,可以有效解决文件持久化数据的实时性问题。。当系统重新启动时,您可以重新运行AOF文件中的命令来恢复数据。AOF首先会将命令添加到AOF缓冲区中,然后根据相应的策略写入硬盘。

AOF实现过程涉及三个步骤

第1步

将命令添加到AOF缓冲区,

第2步

将缓冲区的内容写入程序缓冲区

第3步

将程序缓冲区的内容写入文件

当AOF为persist功能启用后,服务器每完成一条命令的执行,就会将该命令以协议格式添加到redisServer结构体的aof_buf缓冲区中。当服务重新启动时,AOF文件将被加载到缓冲区中。

AOF具有三种触发机制

·always:每当数据发生变化时,都会立即记录到磁盘。性能较差,但数据完整性较好。

·everysec:每秒将aof_buf缓冲区的内容写入AOF文件。如果发生任何宕机,1秒内的数据将会丢失。

·否:将数据同步操作留给操作系统,其性能最好,但数据可靠性最差。在配置文件中设置appendonly=yes后,如果不指定appendfsync,则默认使用Everysec选项。

写指令随着时间的推移会记录很多重复的指令,从而导致数据量非常大。

RDB比AOF优先级高

RDB小,AOF大

RDB慢,AOF快

RDB快,AOF慢