设为首页 收藏本站
查看: 494|回复: 0

[经验分享] redis持久化的快照(snapshot)方法和AOF方法

[复制链接]

尚未签到

发表于 2015-7-22 11:02:55 | 显示全部楼层 |阅读模式
  redis的持久化主要提供了2种方法,快照(snapshot)方法和AOF(append only)方法,做实验试一下这2种方法。
  快照方法是把redis内存中的数据在隔一段时间之后,fork一个子进程,在子进程中将内存中的数据写入存储。当然这种模式下,如果系统异常退出会出现数据的丢失,更严重的是因为要fork子进程,内存的消耗会在短时间内突然倍增。
  下面做实验来看一下,先从启动一个空的redis数据库开始



xxxx@xxxx-computer:~$ ps -ef | grep redis
xxxx     5071  4168  0 10:12 pts/0    00:00:00 grep --color=auto redis
xxxx@xxxx-computer:~$ sudo ls -l /var/lib/redis/dump.rdb
-rw-r--r-- 1 root root 18  2月 15 10:11 /var/lib/redis/dump.rdb
xxxx@xxxx-computer:~$ sudo cat /var/lib/redis/dump.rdb
REDIS0006�ܳC�Z��Vxxxx@xxxx-computer:~$
xxxx@xxxx-computer:~$ sudo redis-server /etc/redis/redis.conf
xxxx@xxxx-computer:~$ redis-cli -h localhost -p 6379
redis localhost:6379> keys *
(empty list or set)
redis localhost:6379> set str1 abcdef
OK
redis localhost:6379> set num1 123
OK
redis localhost:6379> keys *
1) "num1"
2) "str1"
redis localhost:6379> quit
xxxx@xxxx-computer:~$ redis-cli -h localhost -p 6379 shutdown
xxxx@xxxx-computer:~$ sudo ls -l /var/lib/redis/dump.rdb
-rw-r--r-- 1 root root 41  2月 15 10:15 /var/lib/redis/dump.rdb
xxxx@xxxx-computer:~$ sudo cat /var/lib/redis/dump.rdb
REDIS0006�num1�{str1abcdef�O�j'�xxxx@xxxx-computer:~$
xxxx@xxxx-computer:~$ clear
  在set数据之后,用正常的方式shutdown redis,redis-cli shutdown,完成之后,在redis的dump文件中会看到操作中set的数据,如果你看到的是乱码,那么应该是你的redis启用了rdb压缩(rdbcompression),默认这一项是启用的,取消就好。在redis.conf中修改配置



# comment by valleylord, origin setting changes
# rdbcompression yes
rdbcompression no
  如果是redis非正常退出的话,这个在实验中可以用kill来模拟,如之前所说,可能会出现数据丢失,实验步骤如下



xxxx@xxxx-computer:~$ ps -ef |grep redis
xxxx     5192  4168  0 10:20 pts/0    00:00:00 grep --color=auto redis
xxxx@xxxx-computer:~$ sudo ls -l /var/lib/redis/dump.rdb
-rw-r--r-- 1 root root 41  2月 15 10:15 /var/lib/redis/dump.rdb
xxxx@xxxx-computer:~$ sudo cat /var/lib/redis/dump.rdb
REDIS0006�num1�{str1abcdef�O�j'�xxxx@xxxx-computer:~$
xxxx@xxxx-computer:~$ sudo redis-server /etc/redis/redis.conf
xxxx@xxxx-computer:~$ redis-cli -h localhost -p 6379
redis localhost:6379> keys *
1) "str1"
2) "num1"
redis localhost:6379> set str2 wxyz
OK
redis localhost:6379> keys *
1) "str1"
2) "str2"
3) "num1"
redis localhost:6379> get str2
"wxyz"
redis localhost:6379> quit
xxxx@xxxx-computer:~$ sudo ls -l /var/lib/redis/dump.rdb
-rw-r--r-- 1 root root 41  2月 15 10:15 /var/lib/redis/dump.rdb
xxxx@xxxx-computer:~$ sudo killall -9 redis-server
xxxx@xxxx-computer:~$ sudo ls -l /var/lib/redis/dump.rdb
-rw-r--r-- 1 root root 41  2月 15 10:15 /var/lib/redis/dump.rdb
xxxx@xxxx-computer:~$ sudo cat /var/lib/redis/dump.rdb
REDIS0006�num1�{str1abcdef�O�j'�xxxx@xxxx-computer:~$
xxxx@xxxx-computer:~$ ps -ef| grep redis
xxxx     5236  4168  0 10:23 pts/0    00:00:00 grep --color=auto redis
xxxx@xxxx-computer:~$ sudo redis-server /etc/redis/redis.conf
xxxx@xxxx-computer:~$ redis-cli -h localhost -p 6379
redis localhost:6379> get str2
(nil)
redis localhost:6379> keys *
1) "num1"
2) "str1"
redis localhost:6379> quit
  实验中,继续前一个实验的操作,又设置了str2这个key,然后快速的退出,并用kill杀掉redis-server进程,再次启动发现数据str2丢失。实验的效果与配置项save有关,默认配置如下,我没改



save 900 1
save 300 10
save 60 10000
  表示:900秒内,至少有1个key发生变动,那么就写入;以此类推后2条。我刚才的实验中,只修改了1个数据,那么我就需要在900秒内模拟系统异常退出,否则redis还是会写入。
  再来看一下AOF持久化方法,AOF的做法是,将每一次数据的变动写入aof文件,然后类似快照产生的方法,fork一个进程来做,这样就不会丢失数据,这个有点类似与oracle的redo log的原理,但是比较弱。使用AOF之后,快照方法就不再适用,同样,rdb文件中的数据也不会再被读入,而是完全用aof文件代替。redis还对aof做了一些优化,比如aof rewrite,如果一个key有多次写入,那么只取最后一次写入。做实验来看一下,AOF如何做到不丢失数据,首先,在配置文件中启用AOF,默认是不启用的



# comment by valleylord, origin setting changes
# rdbcompression yes
appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename appendonly.aof
  实验的过程如下



xxxx@xxxx-computer:~$ ps -ef | grep redis
xxxx     6769  4168  0 15:26 pts/0    00:00:00 grep --color=auto redis
xxxx@xxxx-computer:~$ sudo redis-server /etc/redis/redis.conf
xxxx@xxxx-computer:~$ redis-cli -h localhost -p 6379
redis localhost:6379> keys *
(empty list or set)
redis localhost:6379> set str2 xyz
OK
redis localhost:6379> set num2 98765
OK
redis localhost:6379> keys *
1) "str2"
2) "num2"
redis localhost:6379> quit
xxxx@xxxx-computer:~$ ls -l /var/lib/redis/appendonly.aof
-rw-r--r-- 1 root root 89  2月 15 15:27 /var/lib/redis/appendonly.aof
xxxx@xxxx-computer:~$ sudo killall -9 redis-server
xxxx@xxxx-computer:~$ ps -ef | grep redis
xxxx     6854  4168  0 15:29 pts/0    00:00:00 grep --color=auto redis
xxxx@xxxx-computer:~$ sudo redis-server /etc/redis/redis.conf
xxxx@xxxx-computer:~$ redis-cli -h localhost -p 6379
redis localhost:6379> get str2
"xyz"
redis localhost:6379> get num2
"98765"
redis localhost:6379> quit
xxxx@xxxx-computer:~$
  在写入数据之后立刻kill掉redis,模拟意外停止服务,然后重启redis,数据并未丢失。同时也可以看到,在改为AOF之后,第一次启服务的时候,之前设置的str1和num1均丢失了,应为改为AOF之后,系统不再从rdb中读数据。这个跟oracle定时将redo log写会存储的做法还是简单了不少。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-89404-1-1.html 上篇帖子: redis安装配置 下篇帖子: Redis缓存服务搭建及实现数据读写--转载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表