Bootstrap

Redis 持久化

持久化的作用:

什么是持久化?

redis的所有数据保存在内存中,对数据的更新将异步保存到磁盘上

持久化的方式

  • 快照-->MySQL dump;Redis RDB
  • 写日志-->MySQL  Binlog;Hbase HLog;Redis AOF

Redis RDB

什么是RDB?

演示

[root@dabaobei ~]# cd /usr/share/redis/redis/
[root@dabaobei redis]# mkdir data
[root@dabaobei redis]# mkdir config
[root@dabaobei redis]# cp redis.conf config/
[root@dabaobei redis]# vim config/redis.conf
[root@dabaobei redis]# mv config/redis.conf config/redis-6001.conf
[root@dabaobei redis]# vim config/redis-6001.conf
daemonize yes  #以守护进程方式启动
pidfile /var/run/redis-6001.pid
logfile "6001.log"
#save 900 1    #这三行注释掉
#save 300 10
#save 60 
dbfilename dump-6001.rdb
dir /usr/share/redis/redis/data
准备测试数据
# yum install -y unix2dos
# cat test.sh
for((i=1;i<=100000;i++))
	do
echo "set k$i v$i" >> redis.txt
	done
# unix2dos redis.txt
unix2dos: converting file redis.txt to DOS format ...
# cat redis.txt | redis-cli -h 127.0.0.1 -p 63001 --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 100000
查看
127.0.0.1:63001> DBSIZE
(integer) 100000
127.0.0.1:63001> info memory
# Memory
used_memory:9862632
used_memory_human:9.41M
used_memory_rss:16117760
used_memory_peak:9862632
used_memory_peak_human:9.41M
used_memory_lua:36864
mem_fragmentation_ratio:1.63
mem_allocator:jemalloc-3.6.0

这里对比不明显,找不到太大的文件来验证,我把数据大小整到120000,在A终端下执行save,立刻切换到B终端,执行get,还是立刻就执行完成了,看不到阻塞的过程,稍后再整更大的数据来测试下

查看刚才自定义的目录下是否有RDB文件生成

# ls /usr/share/redis/data/
63001.log  dump-63001.rdb

验证bgsave时,也是因为数据量太小,在A终端和B终端切换过程中看不到后台生成的新的redis子进程。

最后验证临时文件的生成,也是同理,理论上,数据量足够大的情况下,是可以看到在/data/目录下生成的temp-xxx.rdb文件。

总结 :

RDB是Redis内存到硬盘的快照,用于持久化;

save通常会阻塞Redis;

bgsave不会阻塞Redis,但是会fork新进程;

save自动配置满足任一就会被执行;

有些触发机制不容忽视。

 

;