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
相关推荐
编程爱好者熊浪35 分钟前
两次连接池泄露的BUG
java·数据库
cr7xin1 小时前
缓存三大问题及解决方案
redis·后端·缓存
爱怪笑的小杰杰2 小时前
浏览器端缓存地图请求:使用 IndexedDB + ajax-hook 提升地图加载速度
ajax·okhttp·缓存
TDengine (老段)2 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349842 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE3 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102163 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎3 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP4 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t4 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb