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 查看集群节点
相关推荐
m0_493934532 小时前
HTML怎么创建文章目录锚点_HTML h2-h3自动生成导航【方法】
jvm·数据库·python
2301_813599552 小时前
uni-app怎么做横向滚动导航 uni-app滚动菜单Tab实现教程【代码】
jvm·数据库·python
Wyawsl2 小时前
NoSQL之Redis配置与优化
数据库·redis·nosql
indexsunny2 小时前
互联网大厂Java面试实战:基于微服务与云原生的电商场景问答解析
java·数据库·spring boot·docker·微服务·云原生·kubernetes
m0_678485452 小时前
如何在保留功能逻辑的前提下隐藏网页菜单项(CSS 隐藏技巧).txt
jvm·数据库·python
Wyz201210242 小时前
Python 字典高效合并:自定义处理重复键的完整指南
jvm·数据库·python
2401_897190552 小时前
如何在保留功能逻辑的前提下隐藏网页菜单项(CSS 隐藏
jvm·数据库·python
倔强的石头1062 小时前
NFS网络文件系统下企业级数据库安装排障实战:环境变量失效与权限问题的深度解析
网络·数据库
2501_914245932 小时前
如何在phpMyAdmin中查询加密数据_AES_DECRYPT函数的实时解密展示
jvm·数据库·python