redis的数据都保存在内存中,只有在上篇讲到的特定条件达成时以及正常退出时才会触发持久化操作,错误地停掉服务就会导致内存中的数据丢失。这一篇我们就来对比四种停掉redis服务的方法,看看该如何正确停掉redis服务。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
准备条件
紧接上一篇按照特定配置启动后往下,并且用redis-cli
连接到redis。我事先在redis中创建了3个已经持久化的key做为参照
127.0.0.1:6379> keys *
1) "age"
2) "name"
3) "hobby"
如上一篇所说,在不退出redis服务情况下的持久化设置为默认设置
save 900 1
save 300 10
save 60 10000
也就是说我只是增加一个key的情况,需要过900秒,也就是15分钟才会自动触发持久化。如果新添加的key被持久化了只可能是正常停掉服务而触发的。
下面开始进行4种不同方法的验证。
systemd停掉服务
在redis-cli
中新添加一个key如下
127.0.0.1:6379> set test1 test1
OK
然后马上利用systemd停掉redis服务
[root@testmachine redis]# systemctl stop redis
发现redis-cli
已经断开了连接
127.0.0.1:6379> get test1
Could not connect to Redis at 127.0.0.1:6379: Connection refused
然后启动redis服务
[root@testmachine redis]# systemctl start redis
再次查询
127.0.0.1:6379> get test1
"test1"
这说明利用systemd停掉redis服务可以触发持久化过程。
客户端shutdown
我们再添加一个新的key
127.0.0.1:6379> set test2 test2
OK
在redis-cli
中利用shutdown命令停掉服务
127.0.0.1:6379> shutdown
not connected>
发现进程已经停掉了
[root@testmachine redis]# ps aux | grep redis
root 35421 0.0 0.0 112704 968 pts/1 S+ 15:54 0:00 grep --color=auto redis
root 50628 0.0 0.0 14072 1228 pts/2 S+ 00:53 0:00 ./redis-cli -a xiaofu
然后启动redis服务
[root@testmachine redis]# systemctl start redis
再次查询
127.0.0.1:6379> get test2
"test2"
这说明利用客户端利用shutdown命令停掉redis服务可以触发持久化过程。
kill pid
kill pid
属于正常停掉进程,如果进程有未保存的数据会等保存完以后再停掉进程。
再次添加一个新的key
127.0.0.1:6379> set test3 test3
OK
查询redis-server的进程并停掉
[root@testmachine redis]# ps aux | grep redis
root 37988 0.1 0.1 144012 2036 ? Ssl 15:55 0:01 /usr/local/redis/bin/redis-server *:6379
root 50628 0.0 0.0 14072 1228 pts/2 S+ 00:53 0:00 ./redis-cli -a xiaofu
root 84861 0.0 0.0 112704 972 pts/1 R+ 16:12 0:00 grep --color=auto redis
[root@testmachine redis]# kill 37988
然后启动redis服务
[root@testmachine redis]# systemctl start redis
再次查询
127.0.0.1:6379> get test3
"test3"
这说明利用客户端利用kill pid停掉redis服务可以触发持久化过程。
kill -9 pid
kill -9 pid
属于强制停掉进程,可以很好模拟机器突然断电的场景。
再次添加一个新的key
127.0.0.1:6379> set test4 test4
OK
查询redis-server的进程并强制停掉
[root@testmachine redis]# ps aux | grep redis
root 50628 0.0 0.0 14072 1228 pts/2 S+ 00:53 0:00 ./redis-cli -a xiaofu
root 90989 0.1 0.1 144012 2036 ? Ssl 16:14 0:00 /usr/local/redis/bin/redis-server *:6379
root 100051 0.0 0.0 112708 972 pts/1 S+ 16:17 0:00 grep --color=auto redis
[root@testmachine redis]# kill -9 90989
然后启动redis服务
[root@testmachine redis]# systemctl start redis
再次查询
172.0.1:6379> get test4
(nil)
发现刚才添加的key消失了,并没有被保存下来。
这说明利用客户端利用kill -9 pid停掉redis服务不可以触发持久化过程。
总结
通过上面的对比可以看出来,正常退出,不管是客户端去执行命令,还是机器上停掉进程,都会触发一次持久化过程。但是类似机器断电这种突发状况还是会造成数据的丢失的。我们应该可以学到两点
- 对于操作并不密集的场景,可以考虑适当修改配置文件,加快本地持久化的频率。同时可以在几次操作后在客户端执行
save
命令去手动触发一次持久化 - 正确的停redis服务的方法还是以客户端执行shutdown命令最为推荐
来源:CSDN
作者:T型人小付
链接:https://blog.csdn.net/Victor2code/article/details/104198853