1. 什么是Redis
Redis (REmote DIctionary Server) 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的Key-Value数据库。
text
Redis特点:
├── 内存存储(高性能)
├── 数据结构丰富
├── 持久化支持
├── 主从复制
├── 高可用集群
├── 原子操作
├── 事务支持
├── Lua脚本
└── 发布订阅
2. Redis与MySQL对比
| 特性 | Redis | MySQL |
|---|---|---|
| 存储位置 | 内存 | 磁盘 |
| 读写速度 | 微秒级 | 毫秒级 |
| 数据结构 | 5+种 | 二维表 |
| 事务支持 | 部分支持 | 完整支持 |
| 持久化 | 可选 | 必须 |
| 容量限制 | 物理内存 | 磁盘空间 |
| 查询能力 | 简单 | SQL复杂查询 |
| 适用场景 | 缓存、实时 | 数据存储 |
3. Redis应用场景
text
Redis典型应用:
├── 缓存系统
│ ├── 热点数据缓存
│ ├── 页面缓存
│ └── 对象缓存
├── 计数器
│ ├── 网站访问量
│ ├── 点赞数/评论数
│ └── 限流控制
├── 消息队列
│ ├── 任务队列
│ └── 消息发布订阅
├── 排行榜
│ ├── 游戏排名
│ └── 热门文章
├── 分布式锁
│ └── 并发控制
└── 实时系统
├── 实时分析
└── 实时推荐
二、Redis安装
1. 环境准备
bash
# 检查系统版本
cat /etc/os-release
uname -a
# 安装依赖
yum install -y gcc gcc-c++ make tcl
# 创建redis用户(可选)
useradd -r -s /sbin/nologin redis
2. 源码编译安装
bash
# 下载Redis
cd /usr/local/src
wget https://download.redis.io/releases/redis-7.2.3.tar.gz
tar -xzf redis-7.2.3.tar.gz
cd redis-7.2.3
# 编译安装
make
make install PREFIX=/usr/local/redis
# 创建配置目录
mkdir -p /usr/local/redis/conf
mkdir -p /usr/local/redis/data
mkdir -p /usr/local/redis/logs
# 复制配置文件
cp redis.conf /usr/local/redis/conf/
# 创建软链接
ln -s /usr/local/redis/bin/* /usr/local/bin/
# 验证安装
redis-server --version
redis-cli --version
3. YUM安装(CentOS)
bash
# 添加EPEL仓库
yum install -y epel-release
# 安装Redis
yum install -y redis
# 查看版本
redis-server -v
# 配置文件位置
/etc/redis.conf
/var/lib/redis # 数据目录
/var/log/redis # 日志目录
4. Docker安装
bash
# 拉取镜像
docker pull redis:7.2
# 单机运行
docker run -d \
--name redis \
-p 6379:6379 \
-v /data/redis/data:/data \
-v /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
redis:7.2 \
redis-server /usr/local/etc/redis/redis.conf
# Docker Compose方式
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
redis:
image: redis:7.2
container_name: redis
restart: always
ports:
- "6379:6379"
volumes:
- ./data:/data
- ./conf/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
environment:
- TZ=Asia/Shanghai
EOF
docker-compose up -d
三、Redis配置文件详解
1. 基础配置
conf
# /usr/local/redis/conf/redis.conf
# 绑定IP(0.0.0.0表示所有接口)
bind 127.0.0.1 192.168.1.10
# 或
bind 0.0.0.0
# 端口
port 6379
# 守护进程模式
daemonize yes
# 进程ID文件
pidfile /var/run/redis_6379.pid
# 日志级别(debug/verbose/notice/warning)
loglevel notice
# 日志文件
logfile "/usr/local/redis/logs/redis.log"
# 数据库数量
databases 16
# 工作目录
dir /usr/local/redis/data
2. 内存配置
conf
# 最大内存限制
maxmemory 2gb
# 内存淘汰策略
# noeviction: 不淘汰,内存满时返回错误
# allkeys-lru: 从所有键中淘汰最近最少使用的
# volatile-lru: 从设置了过期时间的键中淘汰LRU
# allkeys-random: 随机淘汰
# volatile-random: 从设置了过期时间的键中随机淘汰
# volatile-ttl: 淘汰存活时间最短的
maxmemory-policy allkeys-lru
# 内存采样数(用于LRU算法)
maxmemory-samples 5
3. 持久化配置
conf
# RDB配置
save 900 1 # 900秒内至少有1个key变化则保存
save 300 10 # 300秒内至少有10个key变化则保存
save 60 10000 # 60秒内至少有10000个key变化则保存
# RDB文件名
dbfilename dump.rdb
# RDB压缩
rdbcompression yes
# RDB校验和
rdbchecksum yes
# AOF配置
appendonly yes # 开启AOF
appendfilename "appendonly.aof" # AOF文件名
# AOF同步策略
# always: 每个命令都同步(最安全,性能最差)
# everysec: 每秒同步一次(折中)
# no: 操作系统决定(性能最好,最不安全)
appendfsync everysec
# 自动重写AOF
auto-aof-rewrite-percentage 100 # 增长100%时重写
auto-aof-rewrite-min-size 64mb # 最小64MB时触发
# AOF重写时是否同步
no-appendfsync-on-rewrite no
4. 安全配置
conf
# 密码认证
requirepass your_strong_password
# 重命名危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG ""
rename-command SHUTDOWN ""
# 保护模式(默认开启)
protected-mode yes
5. 限制配置
conf
# 客户端最大连接数
maxclients 10000
# 客户端超时(0表示不超时)
timeout 0
# TCP keepalive
tcp-keepalive 300
# 慢查询日志
slowlog-log-slower-than 10000 # 微秒
slowlog-max-len 128
# 懒惰删除
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
replica-lazy-flush yes
6. 主从复制配置
conf
# 主节点配置
# 无需特殊配置
# 从节点配置
replicaof 192.168.1.10 6379 # 指定主节点
# 主节点密码(如果设置了)
masterauth your_password
# 从节点只读
replica-read-only yes
# 复制延迟监控
repl-ping-replica-period 10
repl-timeout 60
7. 集群配置
conf
# 开启集群模式
cluster-enabled yes
# 集群配置文件(自动生成)
cluster-config-file nodes-6379.conf
# 集群节点超时时间
cluster-node-timeout 15000
# 集群端口偏移
cluster-port 16379
8. 日志配置
conf
# 慢查询日志
slowlog-log-slower-than 10000
slowlog-max-len 128
# 延迟监控
latency-monitor-threshold 100
# 通知事件
notify-keyspace-events ""
四、Redis基本操作
1. 服务管理
bash
# 启动Redis
redis-server /usr/local/redis/conf/redis.conf
# 停止Redis
redis-cli -a password shutdown
# 重启
redis-cli -a password shutdown
redis-server /usr/local/redis/conf/redis.conf
# 查看状态
ps aux | grep redis
netstat -tlnp | grep 6379
# systemd管理(YUM安装)
systemctl start redis
systemctl stop redis
systemctl restart redis
systemctl status redis
# 创建systemd服务(源码安装)
cat > /etc/systemd/system/redis.service << 'EOF'
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli -a your_password shutdown
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable redis
systemctl start redis
2. 客户端连接
bash
# 本地连接
redis-cli
redis-cli -a password
# 远程连接
redis-cli -h 192.168.1.10 -p 6379 -a password
# 执行命令
redis-cli -a password SET key value
redis-cli -a password GET key
# 进入监控模式
redis-cli -a password monitor
# 查看信息
redis-cli -a password INFO
redis-cli -a password INFO memory
redis-cli -a password INFO stats
# 执行Lua脚本
redis-cli -a password --eval script.lua
3. 基础命令
bash
# 键命令
SET key value # 设置键值
GET key # 获取值
DEL key # 删除键
EXISTS key # 判断是否存在
EXPIRE key seconds # 设置过期时间
TTL key # 查看剩余时间
KEYS pattern # 查找键
RANDOMKEY # 随机返回键
RENAME old new # 重命名
# 字符串
SET name "Redis"
GET name
MSET k1 v1 k2 v2 # 批量设置
MGET k1 k2 # 批量获取
INCR counter # 自增
DECR counter # 自减
INCRBY counter 10 # 增加指定值
STRLEN key # 字符串长度
# 哈希
HSET user:1 name "Tom" age 25
HGET user:1 name
HGETALL user:1
HDEL user:1 age
HEXISTS user:1 name
HKEYS user:1
HVALS user:1
HLEN user:1
# 列表
LPUSH list a b c # 左侧插入
RPUSH list x y z # 右侧插入
LPOP list # 左侧弹出
RPOP list # 右侧弹出
LRANGE list 0 -1 # 获取全部
LINDEX list 0 # 获取索引元素
LLEN list # 列表长度
# 集合
SADD set a b c # 添加成员
SMEMBERS set # 查看所有成员
SISMEMBER set a # 判断成员
SREM set a # 删除成员
SCARD set # 集合大小
SUNION set1 set2 # 并集
SINTER set1 set2 # 交集
SDIFF set1 set2 # 差集
# 有序集合
ZADD zset 1 "a" 2 "b" 3 "c" # 添加成员
ZRANGE zset 0 -1 # 按分数升序
ZREVRANGE zset 0 -1 # 按分数降序
ZSCORE zset a # 获取分数
ZINCRBY zset 5 a # 增加分数
ZRANK zset a # 获取排名
ZREM zset a # 删除成员
ZCARD zset # 集合大小
4. 高级命令
bash
# 事务
MULTI # 开始事务
SET key1 value1
SET key2 value2
EXEC # 执行事务
DISCARD # 取消事务
# 乐观锁
WATCH key # 监视键
MULTI
SET key newvalue
EXEC # 如果key被修改则失败
# 发布订阅
SUBSCRIBE channel # 订阅频道
PUBLISH channel msg # 发布消息
PSUBSCRIBE news.* # 模式订阅
UNSUBSCRIBE # 取消订阅
# Lua脚本
EVAL "return redis.call('GET', KEYS[1])" 1 key
EVALSHA sha1 1 key # 执行缓存的脚本
# 管道
# 客户端批量发送命令,减少网络往返
五、Redis持久化
1. RDB持久化
bash
# RDB手动保存
redis-cli -a password SAVE # 阻塞保存
redis-cli -a password BGSAVE # 后台保存
# 查看RDB信息
redis-cli -a password INFO persistence
# RDB恢复
# 1. 停止Redis
# 2. 将dump.rdb文件复制到工作目录
# 3. 启动Redis
# RDB优缺点
优点:
├── 适合灾难恢复
├── 文件紧凑
├── 性能好
└── 重启快速
缺点:
├── 可能丢失数据
├── 大数据量时fork耗时
└── 版本兼容问题
2. AOF持久化
bash
# AOF重写
redis-cli -a password BGREWRITEAOF
# AOF恢复
# 1. 配置appendonly yes
# 2. 将appendonly.aof文件放到工作目录
# 3. 启动Redis
# AOF修复
redis-check-aof --fix appendonly.aof
# AOF优缺点
优点:
├── 数据更安全
├── 可读性好
├── 文件可追加
└── 丢失数据少
缺点:
├── 文件体积大
├── 恢复速度慢
└── 性能影响较大
3. 持久化最佳实践
bash
# 生产环境配置
# 开启RDB和AOF
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
# 备份脚本
#!/bin/bash
# redis_backup.sh
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
# 备份RDB
cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump_$DATE.rdb
# 备份AOF
cp /var/lib/redis/appendonly.aof $BACKUP_DIR/aof_$DATE.aof
# 保留7天
find $BACKUP_DIR -type f -mtime +7 -delete
echo "Redis backup completed: $DATE"
六、Redis主从复制
1. 主从架构配置
bash
# 主节点配置 (192.168.1.10)
# redis.conf
bind 0.0.0.0
port 6379
requirepass master_password
masterauth master_password
# 从节点配置 (192.168.1.11)
# redis.conf
bind 0.0.0.0
port 6379
replicaof 192.168.1.10 6379
requirepass slave_password
masterauth master_password
# 从节点只读
replica-read-only yes
2. 主从管理命令
bash
# 查看复制信息
redis-cli -a password INFO replication
# 手动配置主从
redis-cli -a password SLAVEOF 192.168.1.10 6379
# 取消复制(提升为主)
redis-cli -a password SLAVEOF NO ONE
# 查看从节点列表
redis-cli -a password INFO replication | grep slave
# 检查同步状态
redis-cli -a password ROLE
3. 主从监控脚本
bash
#!/bin/bash
# redis_replication_monitor.sh
MASTER_HOST="192.168.1.10"
REDIS_PASS="your_password"
LOG_FILE="/var/log/redis_replication.log"
check_replication() {
# 检查主节点
master_role=$(redis-cli -h $MASTER_HOST -a $REDIS_PASS ROLE 2>/dev/null | head -1)
if [ "$master_role" != "master" ]; then
echo "$(date) - ERROR: Master node is not master" >> $LOG_FILE
return 1
fi
# 检查从节点
for slave in 192.168.1.11 192.168.1.12; do
slave_role=$(redis-cli -h $slave -a $REDIS_PASS ROLE 2>/dev/null | head -1)
if [ "$slave_role" != "slave" ]; then
echo "$(date) - ERROR: Slave $slave is not slave" >> $LOG_FILE
continue
fi
# 检查复制延迟
offset=$(redis-cli -h $slave -a $REDIS_PASS INFO replication | grep "master_repl_offset" | cut -d: -f2)
echo "$(date) - Slave $slave offset: $offset" >> $LOG_FILE
done
}
check_replication
七、Redis Sentinel哨兵模式
1. Sentinel架构
text
Sentinel架构图:
┌─────────────────────────────────────────┐
│ Sentinel 1 │
│ Sentinel 2 │
│ Sentinel 3 │
└────────────────┬────────────────────────┘
│ 监控
┌────────┴────────┐
↓ ↓
┌────────┐ ┌────────┐
│ Master │──────→│ Slave1 │
│ │ │ Slave2 │
└────────┘ └────────┘
2. Sentinel配置
bash
# sentinel.conf
# 端口
port 26379
# 守护进程
daemonize yes
# 日志文件
logfile "/var/log/redis/sentinel.log"
# 工作目录
dir "/tmp"
# 监控主节点
# sentinel monitor <name> <ip> <port> <quorum>
sentinel monitor mymaster 192.168.1.10 6379 2
# 主节点密码
sentinel auth-pass mymaster your_password
# 故障转移超时
sentinel failover-timeout mymaster 180000
# 下线确认时间
sentinel down-after-milliseconds mymaster 30000
# 并行同步数量
sentinel parallel-syncs mymaster 1
# 通知脚本
sentinel notification-script mymaster /usr/local/bin/notify.sh
3. 启动Sentinel
bash
# 启动Sentinel
redis-sentinel /usr/local/redis/conf/sentinel.conf
# 或使用redis-server
redis-server /usr/local/redis/conf/sentinel.conf --sentinel
# 查看Sentinel信息
redis-cli -p 26379 INFO sentinel
# 查看主节点信息
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# 查看从节点
redis-cli -p 26379 SENTINEL slaves mymaster
# 手动故障转移
redis-cli -p 26379 SENTINEL failover mymaster
# 重置监控
redis-cli -p 26379 SENTINEL reset mymaster
4. Sentinel监控脚本
bash
#!/bin/bash
# sentinel_monitor.sh
SENTINEL_HOST="127.0.0.1"
SENTINEL_PORT="26379"
MASTER_NAME="mymaster"
while true; do
clear
echo "Redis Sentinel监控 - $(date)"
echo "=============================="
# 获取主节点信息
master=$(redis-cli -h $SENTINEL_HOST -p $SENTINEL_PORT SENTINEL get-master-addr-by-name $MASTER_NAME)
if [ -n "$master" ]; then
master_ip=$(echo $master | awk '{print $1}')
master_port=$(echo $master | awk '{print $2}')
echo "主节点: $master_ip:$master_port"
else
echo "主节点: 不可用"
fi
# 获取从节点信息
echo ""
echo "从节点列表:"
redis-cli -h $SENTINEL_HOST -p $SENTINEL_PORT SENTINEL slaves $MASTER_NAME | \
grep -E "ip|port" | paste - - | awk '{print $2":"$4}'
# Sentinel信息
echo ""
echo "Sentinel集群信息:"
redis-cli -h $SENTINEL_HOST -p $SENTINEL_PORT SENTINEL master $MASTER_NAME | \
grep -E "num-slaves|num-other-sentinels"
sleep 5
done
八、Redis Cluster集群
1. 集群规划
text
Redis Cluster(6节点,3主3从)
节点规划:
├── 192.168.1.10:6379 (master-1)
├── 192.168.1.11:6379 (slave-1)
├── 192.168.1.12:6379 (master-2)
├── 192.168.1.13:6379 (slave-2)
├── 192.168.1.14:6379 (master-3)
└── 192.168.1.15:6379 (slave-3)
槽位分布:
├── 0-5460 (master-1)
├── 5461-10922 (master-2)
└── 10923-16383 (master-3)
2. 集群配置
conf
# redis-cluster.conf
# 基础配置
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis/redis_6379.log"
dir /data/redis/6379
# 集群配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
# 集群端口偏移
cluster-port 16379
# 持久化
appendonly yes
appendfsync everysec
# 内存
maxmemory 2gb
maxmemory-policy allkeys-lru
# 密码
requirepass cluster_password
masterauth cluster_password
3. 创建集群
bash
# 1. 启动所有节点
for port in 6379 6380 6381 6382 6383 6384; do
redis-server /usr/local/redis/conf/redis-$port.conf
done
# 2. 创建集群
redis-cli --cluster create \
192.168.1.10:6379 \
192.168.1.11:6379 \
192.168.1.12:6379 \
192.168.1.13:6379 \
192.168.1.14:6379 \
192.168.1.15:6379 \
--cluster-replicas 1 \
-a cluster_password
# 3. 查看集群信息
redis-cli -a cluster_password CLUSTER INFO
redis-cli -a cluster_password CLUSTER NODES
redis-cli -a cluster_password CLUSTER SLOTS
# 4. 检查集群
redis-cli --cluster check 192.168.1.10:6379 -a cluster_password
# 5. 查看槽位分布
redis-cli -a cluster_password CLUSTER SLOTS
4. 集群管理
bash
# 添加节点
redis-cli --cluster add-node 192.168.1.16:6379 192.168.1.10:6379 -a password
# 添加从节点
redis-cli --cluster add-node 192.168.1.16:6379 192.168.1.10:6379 \
--cluster-slave --cluster-master-id <node-id> -a password
# 删除节点
redis-cli --cluster del-node 192.168.1.10:6379 <node-id> -a password
# 重新分片
redis-cli --cluster reshard 192.168.1.10:6379 -a password
# 平衡槽位
redis-cli --cluster rebalance 192.168.1.10:6379 -a password
# 修复集群
redis-cli --cluster fix 192.168.1.10:6379 -a password
# 导入数据
redis-cli --cluster import 192.168.1.10:6379 --cluster-from 192.168.1.100:6379 -a password
5. 集群客户端连接
bash
# 使用redis-cli连接集群
redis-cli -c -h 192.168.1.10 -p 6379 -a password
# 查看当前连接的节点
redis-cli -c -a password CLUSTER NODES
# 查看键的槽位
redis-cli -c -a password CLUSTER KEYSLOT keyname
# Python连接集群
# pip install redis-py-cluster
九、Redis性能优化
1. 内存优化
bash
# 内存优化配置
# 使用更高效的数据结构
# 配置ziplist阈值
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 内存碎片整理
activedefrag yes
active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10
active-defrag-cycle-min 25
# 大key扫描
redis-cli -a password --bigkeys
# 查看内存使用
redis-cli -a password INFO memory
redis-cli -a password MEMORY STATS
redis-cli -a password MEMORY DOCTOR
# 内存碎片率
# <1: 内存不足
# 1-1.5: 正常
# >1.5: 碎片过多
2. 慢查询优化
bash
# 配置慢查询
slowlog-log-slower-than 10000 # 10ms
slowlog-max-len 128
# 查看慢查询
redis-cli -a password SLOWLOG GET 10
redis-cli -a password SLOWLOG LEN
redis-cli -a password SLOWLOG RESET
# 分析慢查询
redis-cli -a password SLOWLOG GET 100 | \
awk -F '[()]' '{print $2}' | sort -nr | head -20
3. 延迟优化
bash
# 查看延迟
redis-cli -a password --latency
redis-cli -a password --latency-history
redis-cli -a password --latency-dist
# 延迟监控
redis-cli -a password LATENCY LATEST
redis-cli -a password LATENCY HISTORY command
redis-cli -a password LATENCY RESET
# 查看命令统计
redis-cli -a password INFO commandstats
4. 系统优化
bash
# 系统参数优化
cat >> /etc/sysctl.conf << EOF
# Redis优化
vm.overcommit_memory = 1
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048
EOF
sysctl -p
# 禁用透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 设置swappiness
echo 10 > /proc/sys/vm/swappiness
# 限制文件描述符
ulimit -n 65535
# 进程优先级
renice -5 $(pidof redis-server)
5. 性能测试
bash
# 性能测试工具
redis-benchmark -h 127.0.0.1 -p 6379 -a password -c 50 -n 10000
# 测试不同命令
redis-benchmark -t set,get,lpush -n 100000 -q
# 测试管道
redis-benchmark -P 16 -n 1000000 -t set,get
# 测试不同数据大小
redis-benchmark -d 1000 -n 100000 -t set
# 使用Lua脚本测试
redis-benchmark -a password -n 10000 -r 10000 \
script load "redis.call('set', KEYS[1], ARGV[1])" 1
十、Redis监控与运维
1. 监控指标
bash
#!/bin/bash
# redis_monitor.sh - Redis监控脚本
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"
REDIS_PASS="your_password"
MONITOR_DIR="/var/log/redis_monitor"
mkdir -p $MONITOR_DIR
collect_metrics() {
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# 获取Redis信息
redis_info=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS INFO 2>/dev/null)
# 提取关键指标
uptime=$(echo "$redis_info" | grep "uptime_in_seconds:" | cut -d: -f2)
connected_clients=$(echo "$redis_info" | grep "connected_clients:" | cut -d: -f2)
used_memory=$(echo "$redis_info" | grep "used_memory_human:" | cut -d: -f2)
used_memory_rss=$(echo "$redis_info" | grep "used_memory_rss_human:" | cut -d: -f2)
mem_fragmentation_ratio=$(echo "$redis_info" | grep "mem_fragmentation_ratio:" | cut -d: -f2)
total_commands_processed=$(echo "$redis_info" | grep "total_commands_processed:" | cut -d: -f2)
instantaneous_ops_per_sec=$(echo "$redis_info" | grep "instantaneous_ops_per_sec:" | cut -d: -f2)
keyspace_hits=$(echo "$redis_info" | grep "keyspace_hits:" | cut -d: -f2)
keyspace_misses=$(echo "$redis_info" | grep "keyspace_misses:" | cut -d: -f2)
# 计算命中率
hit_rate=$(echo "scale=2; $keyspace_hits * 100 / ($keyspace_hits + $keyspace_misses)" | bc)
# 输出指标
echo "$timestamp,$uptime,$connected_clients,$used_memory,$used_memory_rss,$mem_fragmentation_ratio,$total_commands_processed,$instantaneous_ops_per_sec,$hit_rate" >> $MONITOR_DIR/metrics.csv
# 告警检查
if [ $connected_clients -gt 9000 ]; then
echo "$timestamp - WARNING: High connections: $connected_clients" >> $MONITOR_DIR/alerts.log
fi
if (( $(echo "$mem_fragmentation_ratio > 1.5" | bc -l) )); then
echo "$timestamp - WARNING: High fragmentation: $mem_fragmentation_ratio" >> $MONITOR_DIR/alerts.log
fi
if (( $(echo "$hit_rate < 80" | bc -l) )); then
echo "$timestamp - WARNING: Low hit rate: $hit_rate%" >> $MONITOR_DIR/alerts.log
fi
}
collect_metrics
2. 日常巡检脚本
bash
#!/bin/bash
# redis_health_check.sh - Redis健康检查
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"
REDIS_PASS="your_password"
echo "Redis健康检查报告"
echo "=================="
# 1. 服务状态
echo "1. 服务状态:"
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS PING
if [ $? -eq 0 ]; then
echo " Redis服务正常"
else
echo " Redis服务异常"
fi
# 2. 内存使用
echo -e "\n2. 内存使用:"
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS INFO memory | grep -E "used_memory_human|used_memory_rss_human|mem_fragmentation_ratio"
# 3. 连接数
echo -e "\n3. 连接信息:"
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS INFO clients | grep connected_clients
# 4. 持久化
echo -e "\n4. 持久化状态:"
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS INFO persistence | grep -E "rdb_last_save_time|aof_enabled"
# 5. 复制状态
echo -e "\n5. 复制状态:"
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS INFO replication | grep role
# 6. 键统计
echo -e "\n6. 键统计:"
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS INFO keyspace
# 7. 慢查询
echo -e "\n7. 慢查询(最近10条):"
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS SLOWLOG GET 10
# 8. 大key检查
echo -e "\n8. 大key检查(前10):"
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS --bigkeys 2>/dev/null | grep -A 20 "Biggest"
echo -e "\n健康检查完成"
3. 备份恢复脚本
bash
#!/bin/bash
# redis_backup.sh - Redis备份脚本
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"
REDIS_PASS="your_password"
mkdir -p $BACKUP_DIR
# 1. RDB备份
echo "开始RDB备份..."
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS BGSAVE
# 等待备份完成
while true; do
rdb_bgsave=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS INFO persistence | grep "rdb_bgsave_in_progress" | cut -d: -f2)
if [ "$rdb_bgsave" == "0" ]; then
break
fi
sleep 1
done
# 复制RDB文件
cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump_$DATE.rdb
echo "RDB备份完成: dump_$DATE.rdb"
# 2. AOF备份
if [ -f /var/lib/redis/appendonly.aof ]; then
cp /var/lib/redis/appendonly.aof $BACKUP_DIR/aof_$DATE.aof
echo "AOF备份完成: aof_$DATE.aof"
fi
# 3. 配置文件备份
cp /usr/local/redis/conf/redis.conf $BACKUP_DIR/redis_$DATE.conf
echo "配置备份完成"
# 4. 清理旧备份
find $BACKUP_DIR -type f -mtime +7 -delete
echo "清理7天前的备份"
# 5. 备份到远程(可选)
# rsync -avz $BACKUP_DIR/ user@backup-server:/backup/redis/
echo "Redis备份完成: $DATE"
十一、常见问题排查
1. 连接问题
bash
# 检查服务状态
redis-cli -a password PING
# 检查端口监听
netstat -tlnp | grep 6379
# 检查防火墙
iptables -L -n | grep 6379
# 检查bind配置
grep bind /usr/local/redis/conf/redis.conf
# 检查密码
redis-cli -a wrong_password PING
# (error) NOAUTH Authentication required.
2. 内存问题
bash
# 查看内存使用
redis-cli -a password INFO memory
# 查看最大内存配置
redis-cli -a password CONFIG GET maxmemory
# 查看淘汰策略
redis-cli -a password CONFIG GET maxmemory-policy
# 查找大key
redis-cli -a password --bigkeys
# 内存碎片整理
redis-cli -a password MEMORY PURGE
# 查看键内存占用
redis-cli -a password DEBUG OBJECT key_name
3. 性能问题
bash
# 查看命令统计
redis-cli -a password INFO commandstats
# 查看延迟
redis-cli -a password --latency
# 查看慢查询
redis-cli -a password SLOWLOG GET 100
# 查看当前执行的命令
redis-cli -a password CLIENT LIST
redis-cli -a password INFO clients
# 监控实时命令
redis-cli -a password MONITOR
4. 持久化问题
bash
# 检查RDB状态
redis-cli -a password INFO persistence | grep rdb
# 检查AOF状态
redis-cli -a password INFO persistence | grep aof
# 手动执行RDB
redis-cli -a password BGSAVE
# 手动执行AOF重写
redis-cli -a password BGREWRITEAOF
# 修复AOF文件
redis-check-aof --fix /var/lib/redis/appendonly.aof
# 检查RDB文件
redis-check-rdb /var/lib/redis/dump.rdb
5. 复制问题
bash
# 查看复制状态
redis-cli -a password INFO replication
# 检查角色
redis-cli -a password ROLE
# 手动同步
redis-cli -a password SLAVEOF 192.168.1.10 6379
# 取消复制
redis-cli -a password SLAVEOF NO ONE
# 查看复制偏移量
redis-cli -a password INFO replication | grep -E "master_repl_offset|slave_repl_offset"
十二、总结
Redis配置检查清单
text
□ 基础配置
□ bind正确设置
□ port配置
□ daemonize开启
□ pidfile配置
□ 内存配置
□ maxmemory合理设置
□ maxmemory-policy选择合适策略
□ 内存监控
□ 持久化配置
□ RDB策略合理
□ AOF根据数据重要性开启
□ 备份策略
□ 安全配置
□ requirepass设置强密码
□ 重命名危险命令
□ protected-mode开启
□ 主从复制
□ replicaof配置
□ masterauth配置
□ 复制监控
□ 集群配置
□ cluster-enabled开启
□ cluster-config-file配置
□ 节点互信
□ 性能优化
□ 慢查询配置
□ 延迟监控
□ 系统参数优化
□ 监控告警
□ 关键指标监控
□ 日志收集
□ 告警通知
常用命令速查
| 类别 | 命令 | 说明 |
|---|---|---|
| 连接 | redis-cli -a password |
连接Redis |
| 信息 | INFO |
查看服务器信息 |
| 配置 | CONFIG GET parameter |
获取配置 |
| 监控 | MONITOR |
实时监控命令 |
| 慢查询 | SLOWLOG GET n |
获取慢查询 |
| 备份 | BGSAVE |
后台保存RDB |
| 复制 | SLAVEOF host port |
设置主从 |
| 集群 | CLUSTER NODES |
查看集群节点 |