Redis是一个非关系型的键值对内存型数据库。(也就是说如果Redis关机之后,数据就会自动清除。)
一、持久化
Redis的持久化分为RDB,AOF。
(1)RDB持久化:
也就是通过把内存的数据以快照文件(尾缀为“.rdb”)记录到磁盘里面去,当Redis故障时(也就是Redis宕机时就会故障重启。)从磁盘里面读取快照文件,恢复数据。
那么开启RDB持久化,有两种方式。一种是手动,一种是自动。
1.手动方式:
a.同步RDB(Save):
也就是在Redis里面执行save语句。此时,就会把当前的数据进行的快照文件生成。然后放入到磁盘中去。(因为过程中都是使用主线程来进行RDB,因为锁的原因,其他子线程等所有命令都会被阻塞)
b.异步RDB(bgsave):
也就是使用Redis的子线程来进行RDB,此时子线程之间的操作互不影响。并且不影响主线程的进展。
原理:
2.自动方式:
也就是Redis会自己使用子线程来进行快照文件生成。不需要我们手动执行命令。
那我们如何去设置Redis里面的参数,来让他以这个参数来进行自动工作咧?
配置文件的部署:
假设我们使用docker来布置Redis的话,我们来对redis进行RDB自动配置的一个部署。
大前提:在docker生成Redis容器时一定要把配置文件挂在到宿主机的某个位置。不然Redis时会被硬解码写死在Redis里面,我们无法进入的。
因为我们这里已经把宿主机的redis配置文件与docker生成的redis容器的配置文件已经挂载在一起了。所以我们只需要修改宿主机的redis配置文件,然后重启redis容器就可以生效了。
注意:记得加上 -it !!! -it !!! 因为这样才会让宿主机容器与redis容器里面的配置关联。
我们来看一下redis的配置文件里面的各自参数代表些什么?
开启RDB自动生效:
(1)确定快照文件的自动生成时间限制。
(2)快照文件是否进行压缩处理(不建议开启,因为开启了会占用cpu资源!)
(3)快照文件的名字以及存放位置。
当然:手动模式的时候也是会根据这个配置信息来生成快照文件。
注意:想让rdb文件失效,也就是清空记录,一定要把redis服务关闭之后,再删除rdb文件才会真正的把数据清空。docker部署redis的时候做不到这个操作。所以建议不使用docker来部署redis。
(2)AOF持久化:
Append Only File:追加文件,来实现数据操作记录。我们可以理解为就是一个日志文件。就是用来记录操作。
那为什么没有自定义存放位置咧?因为RDB的自定以存放位置就是AOF的存放位置,但是如果按照上面配置过后,重启redis之后,还是和之前一样没有任何响应的时候,建议直接到容器内部执行
与RDB一样也是分手动启动或者自动启动。
自动启动:
同步刷盘:也就是每执行一个redis命令,都会把命令记录直接放入aof文件里面去。
每秒刷盘:把1s里面执行的所有redis命令放入到aof缓冲区里面区,当1s之后就把这些命令记录全部放入aof文件里面去
手动启动:
操作系统控制:
我们现在回过头来想一个问题,究竟是RDB文件大还是AOF文件大?
当然是AOF文件大!因为AOF是每一次的操作命令都会被记录下来。但是我们知道AOF是每次记录同一个key的value值时,只对最后一次操作的value有效。那之前记录的命令那就是多余的命令,这样非常的占用磁盘空间,为此redis就有aof文件重写功能来应对。
AOF文件重写:
把文件进行重写,把多余的命令进行总和压缩。
此时与之前AOF文件记录过程一样。也是有分手动启动,自动启动。
手动启动:
使用bgrewriteaof命令即可对AOF文件进行重写。
自动启动:
其实也就是在aof文件小于64mb的时候,不进行重写,当aof文件大于64mb的时候,aof才会进行重写。