Redis 实用小技巧——谁动了我的 Redis ?

前几天写了一篇文章《谁动了我的 MySQL ?》,反响还不错。于是心血来潮,把之前遇到的另一个类似的问题整理出来,分享给大家,希望对用到的小伙伴有所帮助。

背景

与溯源 MySQL 的调用端场景类似,这个问题也是出现在我们的开发环境中。Redis 服务部署在测试环境,除了测试环境的程序连接 Redis 之外,开发小伙伴为了调试方便,也会在自己的本地环境连接测试环境的 Redis,这就会造成一个问题:有时候不知道 Redis 的数据到底是被『谁』修改的,这该如何是好呢?

处理思路

处理这种『谁是凶手』的问题,一般都是考虑从『留痕』方面入手。

MySQL 是通过 binlog 来反向推理,那么 Redis 呢?Redis 有没有可以追踪到命令执行痕迹的地方呢?

有,monitor

monitor命令使用文档

经常操作 Redis 的小伙伴对这个命令肯定不会陌生,在日常调试和问题定位的时候往往能起到立竿见影的效果。这里借用使用文档中的例子来看一下它的用法:

127.0.0.1:6379> MONITOR
OK
# 以第一个打印值为例
# 1378822099.421623 是时间戳
# [0 127.0.0.1:56604] 中的 0 是数据库号码, 127...IP 地址和端口
# "PING" 是被执行的命令
1378822099.421623 [0 127.0.0.1:56604] "PING"
1378822105.089572 [0 127.0.0.1:56604] "SET" "msg" "hello world"
1378822109.036925 [0 127.0.0.1:56604] "SET" "number" "123"
1378822140.649496 [0 127.0.0.1:56604] "SADD" "fruits" "Apple" "Banana" "Cherry"
1378822154.117160 [0 127.0.0.1:56604] "EXPIRE" "msg" "10086"
1378822257.329412 [0 127.0.0.1:56604] "KEYS" "*"
1378822258.690131 [0 127.0.0.1:56604] "DBSIZE"

从输出信息中我们可以看到,输出信息中包含了调用客户端的的 IP端口号,通过这两个信息,我们就可以定位到是哪台机器执行的命令了。

根据端口号定位调用程序的命令如下:

lsof -i:{端口号}

在输出中可以看到调用程序的 PID,然后根据 PID 定位到具体的程序:

ps -p {pid} -f

有时如果公司是同一个公网 IP 的话,这时候只能根据端口号的占用情况在本地机器上进行排查了,只是麻烦了点。

在实际应用中,如果 Redis 操作命令频繁的话, monitor 记录的日志数量会很多,不方便直接查阅。我们一般会先将 monitor 内容输出到日志中,命令如下:

redis-cli monitor > ~/redis.log

然后使用 Linux grep 命令进行排查分析就可以了。

cat ~/redis.log | grep '{关键字}'

题外话

在开发环境中,尽量不要在本地环境直连测试环境的 Redis ,因为这会导致在本地进行开发过程中,直接修改测试 Redis 的数据。

本地开发的过程中,操作都比较随意,可能会因为自己本地随意的调试行为,让正在使用测试环境的人痛苦不堪,特别是在本地监听 Redis 队列时。

本作品采用《CC 协议》,转载必须注明作者和本文链接
你应该了解真相,真相会让你自由。
本帖由 MArtian 于 1年前 加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

:scream: 没量的时候,可以随便分析

1年前 评论

看出来是花心思写了

1年前 评论

每天学到一个小技巧

1年前 评论

学习了。很棒!!!

1年前 评论

瞌睡来了,就来了枕头,正好用到

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!