NoSQL之Redis配置与优化
·
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 |
查看集群节点 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)