一、建目录结构脚本 (setup_directories.sh)

#!/bin/bash

# 创建必要的目录
echo "创建Redis目录结构..."
sudo mkdir -p /software/redis/{data,logs,config}

# 设置目录权限
echo "设置目录权限..."
sudo chmod -R 755 /software/redis
sudo chown -R $USER:$USER /software/redis

echo "目录创建完成!"

在这里插入图片描述

二、使Redis配置文件 (redis.conf)

创建文件 /software/redis/config/redis.conf:

# Redis配置文件 - 优化配置

# 基础设置
################################## 网络设置 ###################################
# 绑定地址,0.0.0.0表示允许所有IP连接
bind 0.0.0.0

# 保护模式,设置为no允许远程连接
protected-mode no

# 端口号
port 6379

# 超时时间(秒)
timeout 0

# TCP连接保活时间
tcp-keepalive 300

################################# 通用设置 ####################################
# 以守护进程方式运行(在Docker中设为no)
daemonize no

# 进程PID文件
pidfile /var/run/redis_6379.pid

# 日志级别:debug, verbose, notice, warning
loglevel notice

# 日志文件路径
logfile "/data/redis.log"

# 数据库数量
databases 16

# 是否显示Redis logo
always-show-logo no

################################## 安全设置 ###################################
# 设置Redis密码
requirepass redis123456

# 重命名危险命令,增强安全性
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command SHUTDOWN ""

################################## 内存管理 ###################################
# 最大内存限制,0表示不限制(根据服务器内存调整)
maxmemory 1gb

# 内存达到上限时的策略
maxmemory-policy allkeys-lru

# 内存淘汰采样数
maxmemory-samples 5

############################## 持久化设置 - RDB ###############################
# 启用RDB持久化
save 900 1      # 900秒内至少有1个key被修改
save 300 10     # 300秒内至少有10个key被修改  
save 60 10000   # 60秒内至少有10000个key被修改

# RDB持久化出错时是否停止写入
stop-writes-on-bgsave-error yes

# 压缩RDB文件
rdbcompression yes

# 检查RDB文件完整性
rdbchecksum yes

# RDB文件名
dbfilename dump.rdb

# RDB文件目录
dir /data

############################# 持久化设置 - AOF ###############################
# 启用AOF持久化
appendonly yes

# AOF文件名
appendfilename "appendonly.aof"

# AOF同步策略
# always: 每次写入都同步,最安全但性能最差
# everysec: 每秒同步一次,推荐设置
# no: 由操作系统决定,性能最好但可能丢失数据
appendfsync everysec

# AOF重写期间是否同步
no-appendfsync-on-rewrite no

# 自动触发AOF重写的条件
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 加载AOF时如果文件损坏是否继续
aof-load-truncated yes

################################## 性能优化 ###################################
# 客户端最大连接数
maxclients 10000

# 延迟监控
latency-monitor-threshold 1

# 慢查询日志(微秒)
slowlog-log-slower-than 10000
slowlog-max-len 128

################################## 高级配置 ###################################
# 哈希数据结构配置
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

# 主动重新哈希
activerehashing yes

# 客户端输出缓冲区限制
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

# 每秒执行的任务次数
hz 10

# 动态HZ配置
dynamic-hz yes

三、 安装脚本 (install_redis.sh)

提示:创建my-network,否则删除 --network my-network \

代码如下(示例):

#!/bin/bash

# Redis Docker安装脚本

REDIS_DIR="/software/redis"
CONFIG_FILE="$REDIS_DIR/config/redis.conf"
DATA_DIR="$REDIS_DIR/data"
LOGS_DIR="$REDIS_DIR/logs"
PASSWORD="redis123456"
CONTAINER_NAME="redis"

echo "开始安装Redis Docker容器..."

# 检查Docker是否安装
if ! command -v docker &> /dev/null; then
    echo "错误: Docker未安装,请先安装Docker"
    exit 1
fi

# 检查目录和配置文件是否存在
if [ ! -d "$REDIS_DIR" ]; then
    echo "错误: Redis目录不存在: $REDIS_DIR"
    exit 1
fi

if [ ! -f "$CONFIG_FILE" ]; then
    echo "错误: Redis配置文件不存在: $CONFIG_FILE"
    exit 1
fi

if [ ! -d "$DATA_DIR" ]; then
    echo "错误: 数据目录不存在: $DATA_DIR"
    exit 1
fi

if [ ! -d "$LOGS_DIR" ]; then
    echo "错误: 日志目录不存在: $LOGS_DIR"
    exit 1
fi

echo "✅ 所有目录和配置文件检查通过"

# 拉取最新版Redis镜像
echo "拉取最新版Redis镜像..."
docker pull redis:7.2-alpine

# 停止并删除已存在的Redis容器(如果存在)
if docker ps -a | grep -q "$CONTAINER_NAME"; then
    echo "停止并删除已存在的Redis容器..."
    docker stop $CONTAINER_NAME >/dev/null 2>&1
    docker rm $CONTAINER_NAME >/dev/null 2>&1
fi

# 创建Redis容器
echo "创建Redis容器..."
echo "挂载配置:"
echo "  - 配置文件: $CONFIG_FILE"
echo "  - 数据目录: $DATA_DIR" 
echo "  - 日志目录: $LOGS_DIR"

docker run -d \
  --name $CONTAINER_NAME \
  --restart always \
  --network my-network \ #网络
  -p 6379:6379 \
  -v $CONFIG_FILE:/usr/local/etc/redis/redis.conf \
  -v $DATA_DIR:/data \
  -v $LOGS_DIR:/logs \
  redis:7.2-alpine \
  redis-server /usr/local/etc/redis/redis.conf

# 检查容器是否启动成功
if [ $? -eq 0 ]; then
    echo "Redis容器创建成功!"
    
    # 等待容器完全启动
    echo "等待Redis服务启动..."
    for i in {1..30}; do
        CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' $CONTAINER_NAME 2>/dev/null || echo "unknown")
        
        if [ "$CONTAINER_STATUS" == "running" ]; then
            # 检查Redis服务是否响应
            if docker exec $CONTAINER_NAME redis-cli -a $PASSWORD ping 2>/dev/null | grep -q "PONG"; then
                echo "✅ Redis服务启动成功!"
                break
            fi
        elif [ "$CONTAINER_STATUS" == "restarting" ] || [ "$CONTAINER_STATUS" == "exited" ]; then
            if [ $i -ge 5 ]; then
                echo "❌ 容器状态异常: $CONTAINER_STATUS"
                echo "查看详细日志..."
                docker logs $CONTAINER_NAME --tail 20
                exit 1
            fi
        fi
        
        if [ $i -lt 10 ] || [ $((i % 5)) -eq 0 ]; then
            echo "等待Redis启动...($i/30) - 状态: $CONTAINER_STATUS"
        fi
        sleep 2
    done
    
    # 最终测试Redis连接
    echo "测试Redis连接..."
    if docker exec $CONTAINER_NAME redis-cli -a $PASSWORD ping 2>/dev/null | grep -q "PONG"; then
        echo "✅ Redis安装成功!"
        echo ""
        echo "安装信息:"
        echo "🔑 密码: $PASSWORD"
        echo "🌐 连接地址: localhost:6379"
        echo "🐳 容器名称: $CONTAINER_NAME"
        echo "📁 配置文件: $CONFIG_FILE"
        echo "📁 数据目录: $DATA_DIR"
        echo "📁 日志目录: $LOGS_DIR"
        echo "🔄 重启策略: always"
        
        # 显示容器状态
        echo ""
        echo "容器状态:"
        docker ps -f name=$CONTAINER_NAME
        
        # 显示Redis基本信息
        echo ""
        echo "Redis基本信息:"
        docker exec $CONTAINER_NAME redis-cli -a $PASSWORD info server 2>/dev/null | grep -E "(redis_version|uptime_in_seconds|connected_clients)" | head -3
        
    else
        echo "❌ Redis连接测试失败"
        echo "容器状态:"
        docker ps -a -f name=$CONTAINER_NAME
        echo ""
        echo "详细日志:"
        docker logs $CONTAINER_NAME
        exit 1
    fi
else
    echo "❌ Redis容器创建失败"
    exit 1
fi

四、 启动脚本 (start_redis.sh)

#!/bin/bash

# Redis Docker启动脚本

CONTAINER_NAME="redis"
PASSWORD="redis123456"

echo "启动Redis容器..."

# 检查容器是否存在
if ! docker ps -a | grep -q "$CONTAINER_NAME"; then
    echo "错误: Redis容器不存在,请先运行安装脚本"
    exit 1
fi

# 检查容器是否已经在运行
if docker ps | grep -q "$CONTAINER_NAME"; then
    echo "Redis容器已经在运行中"
    docker ps -f name=$CONTAINER_NAME
    exit 0
fi

# 启动容器
echo "启动Redis容器..."
docker start $CONTAINER_NAME

if [ $? -eq 0 ]; then
    echo "✅ Redis容器启动成功!"
    
    # 等待容器完全启动
    echo "等待Redis服务启动..."
    for i in {1..15}; do
        if docker exec $CONTAINER_NAME redis-cli -a $PASSWORD ping 2>/dev/null | grep -q "PONG"; then
            echo "✅ Redis服务启动成功!"
            break
        fi
        if [ $i -lt 5 ] || [ $((i % 5)) -eq 0 ]; then
            echo "等待Redis启动...($i/15)"
        fi
        sleep 2
    done
    
    # 显示容器状态
    echo "容器状态:"
    docker ps -f name=$CONTAINER_NAME
    
else
    echo "❌ Redis容器启动失败"
    docker logs $CONTAINER_NAME --tail 10
    exit 1
fi

五、 重启脚本(restart-redis.sh)

#!/bin/bash

# Redis Docker重启脚本

CONTAINER_NAME="redis"
PASSWORD="redis123456"

echo "重启Redis容器..."

# 检查容器是否存在
if ! docker ps -a | grep -q "$CONTAINER_NAME"; then
    echo "❌ 错误: Redis容器不存在"
    exit 1
fi

# 检查容器当前状态
if docker ps | grep -q "$CONTAINER_NAME"; then
    echo "Redis容器正在运行,开始停止..."
    
    # 停止容器
    docker stop $CONTAINER_NAME
    
    if [ $? -eq 0 ]; then
        echo "✅ Redis容器停止成功"
        
        # 等待容器完全停止
        echo "等待容器停止..."
        for i in {1..10}; do
            if ! docker ps | grep -q "$CONTAINER_NAME"; then
                echo "✅ Redis容器已完全停止"
                break
            fi
            if [ $i -eq 5 ]; then
                echo "容器正在停止中...请稍候"
            fi
            sleep 1
        done
    else
        echo "❌ Redis容器停止失败"
        exit 1
    fi
else
    echo "Redis容器当前未运行"
fi

# 启动容器
echo "启动Redis容器..."
docker start $CONTAINER_NAME

if [ $? -eq 0 ]; then
    echo "✅ Redis容器启动成功!"
    
    # 等待容器完全启动
    echo "等待Redis服务启动..."
    for i in {1..15}; do
        if docker exec $CONTAINER_NAME redis-cli -a $PASSWORD ping 2>/dev/null | grep -q "PONG"; then
            echo "✅ Redis服务重启成功!"
            
            # 显示容器状态
            echo ""
            echo "容器状态:"
            docker ps -f name=$CONTAINER_NAME
            
            # 显示基本信息
            echo ""
            echo "Redis基本信息:"
            docker exec $CONTAINER_NAME redis-cli -a $PASSWORD info 2>/dev/null | grep -E "(redis_version|uptime_in_seconds|connected_clients|used_memory_human)" | head -5
            
            exit 0
        fi
        
        # 每5次显示一次等待信息
        if [ $i -lt 5 ] || [ $((i % 5)) -eq 0 ]; then
            echo "等待Redis启动...($i/15)"
        fi
        sleep 2
    done
    
    # 如果循环结束仍未启动成功
    echo "❌ Redis服务启动超时,请检查日志"
    docker logs $CONTAINER_NAME --tail 10
    exit 1
    
else
    echo "❌ Redis容器启动失败"
    docker logs $CONTAINER_NAME --tail 10
    exit 1
fi

五、 使用流程

# 给所有脚本添加执行权限
chmod +x install_redis.sh start_redis.sh  restart-redis.sh

# 1. 创建目录结构
./setup_directories.sh

# 2. 创建配置文件(如果还没有的话)
# 将上面的redis.conf内容保存到 /software/redis/config/redis.conf

# 3. 安装Redis
./install_redis.sh

# 4. 启动
./start_redis.sh

总结

  1. 安全性: 设置密码、禁用危险命令、保护模式配置
  2. 持久化: 同时启用RDB和AOF,数据安全可靠
  3. 性能优化: 合理的内存管理和数据结构配置
  4. 自动启动: 使用 --restart always 确保服务自动重启
  5. 数据持久化: 所有数据文件挂载到宿主机
  6. 详细日志: 完整的日志记录和监控配置

更多推荐