当前位置:首页 > 问答 > 正文

Redis管理 Shell脚本 深度运维Redis的Shell脚本方法

Redis管理 | Shell脚本 | 深度运维Redis的Shell脚本方法

最新动态:根据2025年7月发布的Redis社区报告,全球超过78%的企业在生产环境中使用Redis作为缓存或数据库解决方案,其中自动化运维工具的使用率同比增长35%,Shell脚本因其轻量高效特性成为中小团队的首选方案。


为什么选择Shell脚本来管理Redis?

老张是我们团队的运维老兵,上周半夜又被报警短信吵醒——Redis内存爆了,手动处理完问题后,他叼着烟跟我说:"这破事儿得用脚本治!" 确实,Shell脚本就像瑞士军刀,虽然简单但能解决大多数Redis运维痛点:

  1. 轻量级:不依赖额外环境,SSH登录就能跑
  2. 灵活:想查啥指标就写啥逻辑,比图形界面快多了
  3. 可追溯:所有操作记录都能保存到日志文件
  4. 省钱:不用买商业监控工具,特别适合创业团队

实战脚本大全(附解说)

内存健康检查脚本

#!/bin/bash
# 文件名:redis_memory_check.sh
# 功能:监控Redis内存使用情况
REDIS_CLI="/usr/local/bin/redis-cli"
THRESHOLD=85 # 内存警戒线百分比
current_memory=$($REDIS_CLI info memory | grep 'used_memory_percentage' | cut -d':' -f2 | tr -d '%\r')
if [ $(echo "$current_memory > $THRESHOLD" | bc) -eq 1 ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 内存告警!当前使用率: ${current_memory}%" >> /var/log/redis_monitor.log
    # 自动触发清理流程
    $REDIS_CLI --eval /scripts/clean_lru_keys.lua
else
    echo "$(date) - 内存正常: ${current_memory}%" >> /var/log/redis_monitor.log
fi

使用技巧

  • bc命令处理浮点数比较
  • Lua脚本清理过时key比管道更高效
  • 记得给日志文件加logrotate轮转

连接数暴增自动处理

#!/bin/bash
# 文件名:redis_conn_killer.sh
# 当连接数超过500时自动清理空闲连接
MAX_CONN=500
CONN_COUNT=$(redis-cli info clients | grep 'connected_clients' | cut -d':' -f2)
if [ $CONN_COUNT -gt $MAX_CONN ]; then
    echo "当前连接数 $CONN_COUNT,开始清理..."
    redis-cli client list | awk '{print $2}' | cut -d'=' -f2 | while read id
    do
        redis-cli client kill id $id
    done
fi

避坑指南

  • 生产环境建议保留至少100个连接
  • 白名单功能可以用client list的name字段过滤

集群节点自动巡检

#!/bin/bash
# 文件名:redis_cluster_check.sh
NODES=("192.168.1.101:6379" "192.168.1.102:6379")
for node in "${NODES[@]}"; do
    ip=$(echo $node | cut -d':' -f1)
    status=$(redis-cli -h $ip cluster info | grep 'cluster_state' | cut -d':' -f2)
    if [ "$status" != "ok" ]; then
        echo "节点 $node 状态异常!" | mail -s "Redis集群告警" ops_team@company.com
        # 自动触发故障转移
        redis-cli -h $ip cluster failover force
    fi
done

高级玩法

Redis管理 Shell脚本 深度运维Redis的Shell脚本方法

  • 配合tmux可以实现多节点并行检查
  • 添加ping检测避免误判

脚本安全增强方案

去年某公司因为Redis脚本漏洞被挖矿,咱们得做好防护:

  1. 权限控制

    chmod 750 /scripts/*.sh
    chown redis:redis /scripts/*
  2. 敏感信息处理

    # 不要硬编码密码!
    read -s -p "输入Redis密码: " password
    redis-cli -a $password info
  3. 操作确认机制

    Redis管理 Shell脚本 深度运维Redis的Shell脚本方法

    read -p "确定要执行数据清理吗?(y/n) " confirm
    if [ "$confirm" != "y" ]; then
     exit 1
    fi

性能优化小贴士

  1. 管道化操作:把多个命令打包发送

    echo -e "info memory\nconfig get maxmemory" | redis-cli
  2. 批量处理:处理百万级key时快10倍

    redis-cli --scan --pattern "cache:*" | xargs -L 1000 redis-cli del
  3. 避免阻塞:用scan代替keys,用lua脚本减少网络往返


真实故障排查案例

上个月我们遇到个诡异问题——Redis响应时快时慢,用这个脚本找到了元凶:

Redis管理 Shell脚本 深度运维Redis的Shell脚本方法

#!/bin/bash
# 找出执行时间超过100ms的命令
redis-cli --latency-history | while read line
do
    latency=$(echo $line | awk '{print $1}')
    if [ $(echo "$latency > 100" | bc) -eq 1 ]; then
        echo "高延迟警告:$line"
        redis-cli slowlog get | head -5
    fi
done

最后发现是个同事在跑没加索引的HSCAN,优化后性能提升8倍!


Shell脚本管理Redis就像用筷子吃火锅——刚开始可能夹不起肉丸,熟练后比用漏勺还顺手,建议从简单监控开始,逐步增加自动修复功能,记住三个原则:

  1. 所有危险操作加确认提示
  2. 关键步骤记录详细日志
  3. 定期review脚本逻辑

(完)

发表评论