我允诱惑一遍点击
简单明了的开始今天的话题。
数据库是保存数据的地方,那数据库是怎么保存数据的,对于我们开发来说,还是需要了解的,搞不好哪天就出现bug需要用到呢
而Redis的持久化方式有2种,RDB和AOF
RDB持久化方式
在redis的配置文件中,用这样的数据,如下图
image.png
save 900 1代表的意思就是900s内(15分钟)有一次修改或者新增数据库的请求,就促发一次rdb持久化,其他也是一样的意思。
而我们在进行人工的持久化是,需要使用SAVE或者BGSAVE命令
- SAVE是会在主进程中进行持久化的,而因为redis是单进程的嘛,所以这时候就不会接受来着客户端的请求了。这在生成环境中基本上是不允许的
- 一般我们都是使用BGSAVE进行redis的持久化的,这个命令会在主线程中fock一个子进程来持久化,然后主进程继续进行解释处理请求,但是如果这时候如果发生修改原来数据库的请求,子进程是不会进行持久化的,也就是说,BGSAVE只会持久化我们输入这个命令的那个时候数据库中的数据。
具有复制的基本原理 - 1 redis使用fork函数复制当前的进程的副本,也就是开个子进程
- 2 父进程继续处理请求命令,而子进程就把内存的数据写到硬盘的临时文件
- 3 当子进程写完数据后,会覆盖原来的rdb持久化文件,即完成一次快照操作。
注意如果在持久化过程中,因为主进程和子进程是共享一块内存的,如果主进程需要修改内存数据,操作系统会复制一份以保证子进程的正常持久化
AOF的实现
aof是以记录命令行的形式进行备份的
在配置文件中开启,启用参数为
dir ./
appendonly yes
appendfilename appendonly.aof
- dir ./ 是指备注的文件路径
- appendonly 指定开启aof持久化
- appendfilename 持久化文件名字
几个重要的命令
appendonly no
appendonly always
appendonly everysec
第一个是不进行持久化 一个是系统帮我们弄 (30s)一次
第二个是总是进行持久化 消耗行能
第三个是每秒一次持久化 兼顾2着
一般我们采用第三种,可以兼顾行能,只损失1s的数据
还有一个是aof在持久化的时候会自动帮我们优化,保证key是达到最新的
比如你
set 1 2
set 1 3
只有的数据一多,会造成aof文件的脏数据很多
所以redis会帮我们优化,可能把前面的set 1 2 删除掉了。具体还不是很清楚,等以后了解了,在补充
网友评论