redis是一个优秀的NoSql数据库。在数据存储上有很好的性能。下面是我理解的一些redis数据持久化的内容。
redis数据持久化有两种形式。
RDB形式,即快照形式。redis把内存中的数据以快照的形式持久化到磁盘中,格式是以rdb形式的二进制文件。
AOF形式,即以aof文件的形式保存内存中的数据。redis会把收到的每一个命令以数据的形式追加到aof文件中。
快照方式可以做相应的配置,如当内存中的key在1秒内做了n此修改,则发起快照,把数据持久化到磁盘中。需要注意的是每次发起的持久化数据都是全量数据,因此如果数据量比较大的时候,会在单位时间内把大量的数据持久化到磁盘上,给IO造成很大的压力。而且也会丢失数据。
AOF方式是增量的方式持久化数据,因此性能上会好一点。也可以做相应的配置,如每秒钟强制数据持久化。但这样也会数据丢失。当然也可以每次内存中数据有变化的时候,都持久化到磁盘中,但是这种方式对性能造成很大的压力,因此选择很重要,下面是一些配置:
appendonly yes //启用aof持久化方式
appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
appendfsync no //完全依赖os,性能最好,持久化没保证
而且这种方式也会造成大量的垃圾数据,处理的方法是压缩,如可以调用grewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件,如果这个时候有新的修改的时候,redis会把这些数据缓存起来,当压缩完成后再追加到文件中。