前言
什么是持久化?
为什么需要持久化?
众所周知Redis数据库中的数据都是存放在内存中,这种方式效率虽高,但是存在一个非常严重的问题,那就是如果突然停电,数据不久没了吗,所以…
持久化派上用场了,我们需要将我们的数据备份到硬盘上,防止断电或是机器故障导致的数据丢失。
持久化的实现方式有两种:
- RDB:直接保存当前已经存储的数据,相当于复制内存中的数据到硬盘上,需要恢复数据时直接读取即可;
- AOF:保存我们存放数据的所有过程,需要恢复数据时,只需要将整个过程完整地重演一遍就能保证与之前数据库中的内容一致。
RDB
save -- 在执行过程中会占用一定时间,但是也可以单独开一个进程 bgsave
命令执行后,会在服务端目录下生成一个dump.rdb文件,
文件中保存了内存中存放的数据,
当服务器重启后,会自动加载里面的内容到对应数据库中。保存后我们可以关闭服务器:
shutdown
大致流程
不是所以方法都是十全十美的,肯定是有缺点的,当数据库的数据量太大,那么复制一次就需要花费大量的时间。所以我们可以设置每隔一段时间自动进行保存。
save 10 66 # 10秒)内有66个写入
AOF
虽然RDB能够很好地解决数据持久化问题,但是它的缺点也很明显:每次都需要去完整地保存整个数据库中的数据,同时后台保存过程中也会产生额外的内存开销,最严重的是它并不是实时保存的,如果在自动保存触发之前服务器崩溃,那么依然会导致少量数据的丢失。
而AOF就是另一种方式:
它会以日志的形式将我们每次执行的命令都进行保存,服务器重启时会将所有命令依次执行,通过这种重演的方式将数据恢复,这样就能很好解决实时性存储问题。
AOF持久化策略(默认每秒):
在redis.windows.conf修改参数
appendfsync always --同步持久化,每次发生数据变更会被立即记录到磁盘,性能差但数据完整性比较好
appendfsync everysec --(异步操作,每秒记录,如果一秒钟内宕机,有数据丢失)
appendfsync no --(将缓存回写的策略交给系统,linux 默认是30秒将缓冲区的数据回写硬盘的)
appendonly yes # appendfsync always appendfsync everysec # appendfsync no
但是AOF的缺点也很明显,每次服务器启动都需要进行过程重演,相比RDB更加耗费时间,并且随着我们的操作变多,不断累计,可能到最后我们的aof文件会变得很大。但是我们也有相应的办法来解决。
Redis有一个AOF重写机制进行优化,比如我们执行了这样的语句:
lpush test 666 lpush test 777 lpush test 888
实际上用一条语句也可以实现
lpush test 666 777 888
也可以在配置文件中配置自动重写
# 百分比计算 auto-aof-rewrite-percentage 100 # 当达到这个大小时,触发自动重写 auto-aof-rewrite-min-size 64mb
最后我们再来进行一下总结:
- AOF:
- 优点:存储速度快、消耗资源少、支持实时存储
- 缺点:加载速度慢、数据体积大
- RDB:
- 优点:加载速度快、数据体积小
- 缺点:存储速度慢大量消耗资源、会发生数据丢失