要监控Redis的命中率和连接数,需要通过Redis提供的命令获取原始数据,再结合数据处理和可视化工具实现实时监控。以下是具体实现方案:

一、命中率监控

1. 核心指标说明

  • 命中率 = keyspace_hits / (keyspace_hits + keyspace_misses)
    • keyspace_hits: 成功查询到数据的次数
    • keyspace_misses: 未找到数据的次数

2. 数据采集方法

  • Redis命令
    # 获取实时统计信息
    redis-cli info stats | grep -E "(keyspace_hits|keyspace_misses)"
      
    # 输出示例:
    keyspace_hits: 123456
    keyspace_misses: 789
    
  • Python示例代码
    import redis
      
    def get_hit_rate(host='localhost', port=6379):
        r = redis.Redis(host=host, port=port)
        info = r.info('stats')
        hits = info['keyspace_hits']
        misses = info['keyspace_misses']
        return hits / (hits + misses) if (hits + misses) > 0 else 0
    

3. 告警规则

  • 低命中率告警:当命中率 < 80% 时触发警告
  • 异常穿透告警:当keyspace_misses在1分钟内增长超过1000次

二、连接数监控

1. 核心指标说明

  • connected_clients: 当前客户端连接数
  • maxclients: Redis配置允许的最大连接数
  • rejected_connections: 因超过maxclients被拒绝的连接数
  • blocked_clients: 正在等待阻塞命令(如BLPOP)的客户端数

2. 数据采集方法

  • Redis命令
    # 获取连接信息
    redis-cli info clients
      
    # 输出示例:
    connected_clients: 45
    client_recent_max_input_buffer: 8
    client_recent_max_output_buffer: 0
    blocked_clients: 0
    
  • Go示例代码
    package main
      
    import (
        "github.com/go-redis/redis/v8"
        "context"
    )
      
    func getConnections(addr string) map[string]interface{} {
        rdb := redis.NewClient(&redis.Options{Addr: addr})
        ctx := context.Background()
          
        info, _ := rdb.Info(ctx, "clients").Result()
        // 解析info字符串获取具体值
        return map[string]interface{}{
            "connected_clients": 45,
            "blocked_clients":   0,
        }
    }
    

3. 告警规则

  • 连接数预警:当connected_clients > maxclients * 0.8时触发
  • 阻塞客户端告警:当blocked_clients > 5持续1分钟时告警
  • 连接拒绝告警:当rejected_connections突然增加时

三、监控系统集成方案

方案1:Prometheus + Grafana

  1. 部署Redis Exporter
    docker run -d --name redis_exporter \
      -p 9121:9121 \
      oliver006/redis_exporter \
      --redis.addr redis://your_redis_host:6379
    
  2. Grafana仪表盘配置
    • 导入官方Dashboard ID 7635(Redis仪表盘)
    • 命中率计算公式
      sum(redis_keyspace_hits_total) / (sum(redis_keyspace_hits_total) + sum(redis_keyspace_misses_total))
      
    • 连接数监控面板:直接使用redis_connected_clients指标

方案2:ELK Stack

  1. Filebeat配置 ```yaml filebeat.inputs:
    • type: redis hosts: [“redis_host:6379”] stats: true period: 10s ```
  2. Kibana可视化
    • 创建TSVB可视化:
      • Y轴(连接数):max(redis.clients.connected)
      • Y轴(命中率):sum(redis.stats.keyspace_hits)/(sum(redis.stats.keyspace_hits)+sum(redis.stats.keyspace_misses))

四、异常场景处理指南

| 异常现象 | 可能原因 | 解决方案 | | ———————– | ——————————– | ————————————- | | 命中率持续低于50% | 1. 缓存穿透
2. Key过期集中 | 1. 增加布隆过滤器
2. 分散过期时间 | | 连接数突然飙升 | 1. 客户端连接泄漏
2. 突发流量 | 1. 检查client list
2. 扩容连接池 | | blocked_clients持续存在 | 长时间阻塞操作 | 检查SLOWLOG和阻塞命令使用情况 |

五、高级监控技巧

  1. 连接来源分析

    # 获取详细客户端列表
    redis-cli client list
       
    # 输出示例:
    id=5 addr=192.168.1.10:34567 fd=8 name= age=15 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 ...
    

    ```

  2. 预测性分析
    # 使用时间序列预测连接数趋势
    from fbprophet import Prophet
       
    def predict_connections(df):
        model = Prophet()
        model.fit(df.rename(columns={'timestamp':'ds', 'connections':'y'}))
        future = model.make_future_dataframe(periods=24, freq='H')
        forecast = model.predict(future)
        return forecast[['ds', 'yhat']]
    
  3. 动态基线告警 ```yaml

    使用动态阈值(如3σ原则)

    alert: HighConnections expr: | redis_connected_clients > (avg_over_time(redis_connected_clients[7d])

    • 3 * stddev_over_time(redis_connected_clients[7d]) for: 10m ```

通过以上方法,可以实现对Redis命中率和连接数的精细化监控。建议将监控数据与业务指标(如QPS、响应时间)关联分析,当命中率下降时能快速发现是否由新上线功能导致,连接数激增时能定位到具体客户端IP。