Redis是基于内存的数据库,内存数据库有个弊端,就是宕机或者断电时,内存的数据会丢失。因此redis提供了两种数据持久化的方式
1.内存快照
内存快照方式是将内存中的数据以二进制方式写,默认文件名 dump.rdb。redis客户端提供save和bgsave命令告诉redis需要做一次内存快照
save
save命令在主线程中保存内存快照,由于redis由单线程处理所有请求,因此save命令可能会阻塞其他用户的请求
bgsave
bgsave会fork出一个子进程来保存内存快照,主进程继续处理客户端请求,从而不会阻塞其他客户端的请求
内存快照的相关配置如下(可以自由进行灵活的配置)
save 900 1
save 300 10
save 60 10000
2.日志追加(AOF)
日志追加方式是把增加或修改数据的
命令通过write函数追加到文件尾部(appendonly.aof),redis重启时读取appendonly.aof的命令,从而把数据写入到内存。但是,操作系统内核I/O接口可能存在缓存,所以导致数据不能立即写入到appendonly.aof文件中,可能会导致部分数据的丢失。可以在配置文件中做如下配置
appendonly yes #启动日志追加的方式
appendonly always #每次修改命令就强制写入磁盘
#appendonly everysec #每秒强制写入
#appendonly no #是够写入依赖操作系统
日志追加的方式会带来appendonly.aof 文件的冗余,比如调用了1000次incr key 命令,appendonly.aof中就会保存1000条incr key命令,其实一次set key 1000就够了。redis也提供了bgrewriteaof命令来压缩日志文件