持久化的作用:
什么是持久化?
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自动配置满足任一就会被执行;
有些触发机制不容忽视。