Redis是一个“纯内存”数据库(至少在2.4版本以后vm机制就被废弃掉了),内存数据持久化的方式有两种——快照方式与AOF方式,这里简要介绍一下两者区别。
实验环境
Redis Master(下面简称M)
Redis Slave(下面简称S)
另外写一个脚本频繁向M插入数据
1,采取SnapShotting
- S数据库挂掉,M数据库继续提供服务,重启S数据库后,恢复和M一样
- M数据库挂掉,脚本插入出错,M数据库来不及持久化内存数据,重启M数据库后,S数据库也恢复到M的内容,就算S数据库做了save操作也会丢失M没来得及“快照”的数据。大致过程如下:
M(0) S(0) ~~client begin to push data M(10054) S(10054) ~~snapshot at 10054 M(40614) S(40614) ~~kill master M(down) S(40614) ~~save S M(restart) S(40614) M(10054) S(10054) ~~S loses data too
这里比较费解,为了充分利用M数据库的性能,其实我们可以把数据库的持久化放在S来操作,可是为什么M挂掉重启后S的持久化并没有生效呢,求解释。一种解决方案是遭遇M挂掉时将S作为主库(Slave of none),重启的M数据库作为从库(Slave of <S IP>)来保证修复期间数据的一致性。
2,M数据库采用Append Only File
- S数据库挂掉,M数据库继续提供服务,重启S数据库后,恢复和M一样
- M数据库挂掉,重启M以后redis会参照aof文件恢复数据库内容,大致过程如下:
M(0) S(0) ~~client begin to push data M(40613) S(40613) ~~kill master M(down) S(40613) ~~save S [M dump.rdb 18B appendonly.aof 9.1M) and ((S dump.rdb 5.7M)] M(restart) S(40613) M(40613) S(40613) [M dump.rdb 5.7M appendonly.aof 9.1M) and ((S dump.rdb 5.7M)]
aof文件占用磁盘大从上面的对照可以看出,而且使用aof功能后对性能上有一点影响,不过测试了一下,约莫估计性能差别也是在10%以内吧。
使用redis时最好设置maxmemory,根据我们的业务事先估计所需的内存量,我刚开始用redis时冒失地让它跑满虚拟机的内存,结果虚拟机经常出现死机。所以还需要预留一些闲置内存,按照下面一些资料的介绍说预留和redis占用内存同样大小的空间吧,没有详细分析测试。
相关资料
Redis 配置文件 redis.conf
对redis数据持久化的一些想法
Redis千万级的数据量的性能测试