Redis从入门到精通(3):正确停掉redis服务

假如想象 提交于 2020-02-06 19:21:32

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命令最为推荐
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!