03.一键编译安装Redis脚本

一键编译安装Redis脚本

bash 复制代码
#!/bin/bash

# 任何命令失败即退出
set -e

# 设置版本和安装路径
REDIS_VERSION="redis-7.2.6"
PASSWORD="123456"
INSTALL_DIR="/apps/redis"

# 获取 CPU 核心数用于 make -j
CPUS=$(lscpu | awk '/^CPU\(s\)/{print $2}')

# 获取系统信息
. /etc/os-release

# 颜色函数
color() {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ]; then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "
    elif [ $2 = "failure" -o $2 = "1" ]; then
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo
}

# 安装依赖包
prepare() {
    color "正在安装依赖包..." 2
    if [[ "$ID" == "centos" || "$ID" == "rocky" ]]; then
        dnf -y install gcc make jemalloc-devel systemd-devel || { color "依赖安装失败" 1; exit 1; }
    else
        apt update && apt -y install gcc make libjemalloc-dev libsystemd-dev || { color "依赖安装失败" 1; exit 1; }
    fi
    color "依赖包安装完成" 0
}

# 下载并编译安装 Redis
install_redis() {
    color "开始下载并编译 Redis..." 2

    # 检查是否存在源码包
    if [ ! -f "${REDIS_VERSION}.tar.gz" ]; then
        wget https://download.redis.io/releases/${REDIS_VERSION}.tar.gz || { color "Redis 源码下载失败" 1; exit 1; }
    fi

    tar xf ${REDIS_VERSION}.tar.gz -C /usr/local/src/
    cd /usr/local/src/${REDIS_VERSION} || { color "进入源码目录失败" 1; exit 1; }

    # 编译安装
    make -j ${CPUS} USE_SYSTEMD=yes PREFIX=${INSTALL_DIR} install || { color "Redis 编译安装失败" 1; exit 1; }
    color "Redis 编译安装完成" 0

    # 创建软链接
    ln -sf ${INSTALL_DIR}/bin/redis-* /usr/local/bin/

    # 创建相关目录
    mkdir -p ${INSTALL_DIR}/{etc,log,data,run}

    # 复制配置文件
    cp redis.conf ${INSTALL_DIR}/etc/

    # 修改配置文件
    sed -i -e 's/^bind .*/bind 0.0.0.0/' \
       -e "/# requirepass/a requirepass ${PASSWORD}" \
       -e "/^dir .*/c dir ${INSTALL_DIR}/data/" \
       -e "/logfile .*/c logfile ${INSTALL_DIR}/log/redis_6379.log" \
       -e "/^pidfile .*/c pidfile ${INSTALL_DIR}/run/redis_6379.pid" \
       -e "/^dbfilename .*/c dbfilename dump_6379.rdb" \
       ${INSTALL_DIR}/etc/redis.conf

    color "Redis 配置文件已更新" 0
}

# 创建 Redis 用户
create_user() {
    color "正在创建 Redis 用户..." 2
    if id redis &> /dev/null; then
        color "Redis 用户已存在" 1
    else
        useradd -r -s /sbin/nologin redis && color "Redis 用户创建成功" 0
    fi
    chown -R redis:redis ${INSTALL_DIR}
}

# 优化系统参数
optimize_system() {
    color "正在优化系统内核参数..." 2
    cat >> /etc/sysctl.conf <<EOF
net.core.somaxconn = 4096
vm.overcommit_memory = 1
EOF
    sysctl -p > /dev/null
    color "系统参数优化完成" 0
}

# 创建 Systemd 服务
setup_systemd() {
    color "正在配置 Systemd 服务..." 2

    cat > /lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
ExecStart=${INSTALL_DIR}/bin/redis-server ${INSTALL_DIR}/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT \$MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000

[Install]
WantedBy=multi-user.target
EOF

    systemctl daemon-reload
    systemctl enable --now redis &> /dev/null

    if systemctl is-active --quiet redis; then
        color "Redis 服务启动成功" 0
        sleep 2
        redis-cli -a ${PASSWORD} INFO Server 2>/dev/null | grep -i version
    else
        color "Redis 启动失败,请检查日志" 1
        exit 1
    fi
}

# 执行所有步骤
prepare
install_redis
create_user
optimize_system
setup_systemd

color "Redis 安装完成!版本信息如下:" 0

redis-cli -a ${PASSWORD} INFO Server 2>/dev/null | grep -i version
相关推荐
哈__1 小时前
从 MySQL 到在线表格:NocoDB 自托管部署、数据导入与远程访问
数据库·mysql
倔强的石头1062 小时前
高可用与无感扩容——分布式时序数据库选型指南
数据库·分布式·时序数据库
袋鼠云数栈10 小时前
实时湖仓如何真正做到“数据够新”?
大数据·数据库·人工智能·数据治理
ACP广源盛1392462567310 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#YLB3116 中端多盘存储扩展在 AI 服务中的机会与应用场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos
ACP广源盛1392462567311 小时前
M6/M5 Pro Mac mini 端侧 AI 新形态@ACP#GSV5800 Serdes 长距离视频传输在 AI 服务中的机会与落地场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos·音视频
倔强的石头_13 小时前
事务边界与批量写入:避免长事务、锁等待和日志压力
数据库
努力努力再努力wz13 小时前
【Redis入门系列】从 KEYS 到 SCAN:渐进式遍历、Cursor 与位反转原理
数据库·redis·缓存
坐吃山猪13 小时前
【多线程】Lock与Condition
大数据·数据库
互联网叫兽14 小时前
redis深入学习一
redis
小宋102114 小时前
大模型成本怎么控制:Token统计、缓存与模型路由实战
人工智能·缓存