在Redis运维和开发过程中,了解哪些客户端连接并访问了特定的数据库(如db0)是一个常见的需求。例如,你可能需要排查异常访问、进行安全审计,或者优化资源分配。然而,Redis本身并不直接提供历史访问日志,因此我们需要借助一些内置命令和外部工具来实现这一目标。
本文将详细介绍如何查询访问Redis特定数据库(如db0)的客户端IP,涵盖以下内容:
CLIENT LIST、MONITOR)CLIENT LIST 命令(推荐)Redis提供了CLIENT LIST命令,可以列出所有当前连接的客户端信息,包括:
addr:客户端IP和端口db:当前选择的数据库name:客户端名称(如果有)idle:空闲时间(秒)redis-cli CLIENT LIST输出示例:
id=5 addr=192.168.1.100:52314 fd=8 name= age=15 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
id=6 addr=10.0.0.2:38429 fd=9 name= age=3 idle=3 flags=N db=1 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=getdb0的客户端由于Redis本身不支持grep,我们可以使用Shell管道:
redis-cli CLIENT LIST | grep "db=0"或者更精确地提取IP:
redis-cli --raw CLIENT LIST | awk -F ' ' '{for(i=1;i<=NF;i++){if($i~/^addr=/){addr=$i} if($i~/^db=/){db=$i}} if(db=="db=0"){print addr}}'输出:
addr=192.168.1.100:52314MONITOR 命令(调试用,慎用)MONITOR 可以实时打印所有Redis命令,包括SELECT操作,但对性能影响较大,仅适用于临时调试:
redis-cli MONITOR | grep "select 0"输出示例:
1654321000.123456 [0 192.168.1.100:52314] "SELECT" "0"注意:
MONITOR会显著增加Redis的CPU负载,不建议在生产环境长期使用。
如果客户端执行了较慢的操作,Redis会记录到慢查询日志(需配置):
redis-cli SLOWLOG GET 10 # 获取最近10条慢查询如果发现SELECT 0相关的慢查询,可以结合CLIENT LIST进一步分析。
Redis 6.0 引入了审计日志功能,可以记录所有命令,包括SELECT操作。
redis.conf)# 启用审计日志
audit-log-enabled yes
# 日志文件路径
audit-log-file /var/log/redis/audit.log
# 记录所有命令
audit-log-command all重启Redis后,日志会记录类似:
SELECT 0 by client: 192.168.1.100:52314db0访问记录grep "SELECT 0" /var/log/redis/audit.log如果Redis本身没有足够日志,可以通过系统工具监控网络连接。
tcpdump 抓包sudo tcpdump -i eth0 port 6379 -A | grep "SELECT 0"例如,iptables可以记录访问Redis的IP:
iptables -A INPUT -p tcp --dport 6379 -j LOG --log-prefix "Redis-Access: "日志通常位于/var/log/syslog或/var/log/messages。
安装Redis Exporter
docker run -d --name redis_exporter -p 9121:9121 oliver006/redis_exporter配置Prometheus
scrape_configs:
- job_name: 'redis'
static_configs:
- targets: ['redis_exporter:9121']Grafana Dashboard
redis_connected_clients和redis_command_calls方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
CLIENT LIST | 实时查询当前连接 | 简单直接 | 不记录历史 |
MONITOR | 调试实时命令 | 完整记录所有操作 | 性能影响大 |
慢查询日志 | 分析慢操作 | 低开销 | 仅记录慢查询 |
审计日志(Redis 6.0+) | 长期审计 | 完整记录所有命令 | 需要额外存储 |
网络监控(tcpdump) | 深度排查 | 不依赖Redis | 需要root权限 |
最佳实践建议:
CLIENT LIST + MONITOR希望本文能帮助你高效监控Redis数据库访问! 🚀