#!/bin/bash
#DEST: 本地环境搭建redis
#verion: 1.0
#
# 系统 Centos7.9 2009
# 脚本一键编译安装redis
# 使用需要有root权限
# 若yum安装依赖报错或无法安装,尝试手动安装或跳过checkTools函数即可
# 初始端口密码于开头声明变量可按需求更改
# 脚本使用搭配官网下载好的安装包,解压后将脚本置于安装包文件夹内运行即可
# 适用于redis3.x-5.x 如需要高版本,编译安装正常,需要手动改配置文件部分
# 默认安装目录 /opt/ 日志 /var/log 二进制文件 /uar/local/bin
#
[[ $USER != "root" ]] && echo -e "\033[31m +-------------请使用ROOT用户操作!\033[0m"&& \
echo -e "\033[31m +-------------安装程序退出\033[0m" && exit 2
source /etc/profile
cat /etc/redhat-release
LIMT_MEM=$(awk '/MemTotal/ {printf("%.0f\n", $2*0.8)}' /proc/meminfo)
#HOST_IP=`ifconfig eth0 | awk '/inet / {print $2}'`
REDIS_PORT="16379"
REDIS_PWD="123456"
INSTALL_DIR=/opt/redis
REDIS_LOG_DIR="/var/log/redis"
RDB_DIR="${INSTALL_DIR}/data/"
# 初始化创建用户与目录
[[ ! -d ${INSTALL_DIR} ]] && mkdir -p ${INSTALL_DIR}
[[ ! -d ${REDIS_LOG_DIR} ]] && mkdir -p ${REDIS_LOG_DIR}
[[ ! -d ${RDB_DIR} ]] && mkdir -p ${RDB_DIR}
id redis &>/dev/null
[[ $? != 0 ]] && groupadd redis && useradd redis -u 1005 -g redis
mv ./* ${INSTALL_DIR}
chown -R redis.redis /opt/redis
# 检查yum源
checkYumRepo(){
if sudo yum list -q updates >/dev/null 2>&1; then
echo -e "\033[32m +-------------Yum 源可用\033[0m"
else
echo -e "\033[31m +-------------Yum 源不可用\033[0m" &&\
read -p "\033[31m +-------------请确认是否不需要Yum源 y/n\033[0m" ACK &&\
[[ $ACK != "n" ]] && exit 2
fi
}
# 检查编译工具版本
checkTools(){
GCC_MIN_VERSION="4.7"
gcc_version=$(gcc --version | awk '{print $NF}')
if [[ $(echo -e "$gcc_version >= $GCC_MIN_VERSION" | bc -l) -eq 0 ]]; then
echo -e "\033[31m +-------------GCC 版本过低,需要升级到 $GCC_MIN_VERSION 或更高版本\033[0m"
checkYumRepo
# 安装 devtoolset-9(包含 GCC 9)软件集合
sudo yum install centos-release-scl -y
#sudo yum install devtoolset-9 -y
fi
# 检查 make 是否已安装
if ! command -v make &> /dev/null; then
echo -e "\033[31m +-------------未找到 make 工具,将尝试安装\033[0m"
sudo yum install make -y
fi
# 检查 C++ 编译器是否已安装
if ! command -v g++ &> /dev/null; then
echo -e "\033[31m +-------------未找到 C++ 编译器,将尝试安装\033[0m"
sudo yum install gcc-c++ -y
fi
}
compileInstall(){
while true
do
echo -e "\033[32m +-------------编译开始\033[0m"
cd ${INSTALL_DIR}/src && make || make clean && checkTools
cd ${INSTALL_DIR}/src && make install
if [ -x "/usr/local/bin/redis-cli" ]; then
echo -e "\033[33m +-------------编译成功\033[0m"
break
fi
echo -e "\033[31m +-------------编译失败\033[0m"
echo -e "\033[31m +-------------重试编译\033[0m"
done
}
checkConf(){
echo -e "\033[32m +-------------写入配置文件\033[0m"
cp ${INSTALL_DIR}/redis.conf ${INSTALL_DIR}/redis.conf.bk
#配置文件仅做简单优化,内存限制当前主机80%,关闭TMP,启用密码,启用rdb
#防止低内存保存错误
sysctl vm.overcommit_memory=1
# 禁用TMP
echo -e "\033[31m +-------------禁用TMP\033[0m"
echo madvise | tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | tee /sys/kernel/mm/transparent_hugepage/defrag
cat > ${INSTALL_DIR}/redis.conf<<EOF
protected-mode no
port ${REDIS_PORT}
tcp-backlog 511
requirepass "${REDIS_PWD}"
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_${REDIS_PORT}.pid
loglevel notice
logfile "${REDIS_LOG_DIR}/redis${REDIS_PORT}.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump_${REDIS_PORT}.rdb
dir ${RDB_DIR}
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
maxmemory ${LIMT_MEM}
#
#主从模式从库需手动配置
#从库可考虑开启aof或混合
#slaveof ip port
#masterauth 主节点密码
#slave-read-only yes
EOF
chown redis.redis /var/log/redis
chmod 755 /var/log/redis
chown redis.redis /opt/redis/redis.conf
chmod 644 /opt/redis/redis.conf
echo -e "\033[32m +-------------写入配置文件成功\033[0m"
}
# 添加systemd并运行检查程序状态
writeService(){
echo -e "\033[32m +-------------写入systemd\033[0m"
cat > /usr/lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /opt/redis/redis.conf
# 无法终止进程,因为自带命令需要输入密码,需要终止请手动关闭
# /usr/local/bin/redis-cli shutdown -a "密码" -p "端口"
ExecStop=pkill -f redis
User=redis
Group=redis
[Install]
WantedBy=multi-user.target
EOF
echo -e "\033[32m +-------------写入systemd成功\033[0m"
echo -e "\033[32m +-------------启动Redis服务\033[0m"
systemctl daemon-reload
systemctl enable redis
echo -e "\033[32m +-------------正在启动Redis服务\033[0m"
systemctl start redis
sleep 6
# 检测 Redis 服务是否在运行并且监听指定端口
if ps aux | grep -v grep | grep -q "redis" && ss -tln | grep -q ":${REDIS_PORT}"; then
echo -e "\033[32m +-------------Redis 服务正在运行并监听 ${REDIS_PORT} 端口\033[0m"
echo -e "\033[32m +-------------Redis 服务安装成功!\033[0m"
echo -e "\033[32m +-------------测试服务连接性\033[0m"
echo ping | redis-cli -a "${REDIS_PWD}" -p ${REDIS_PORT}
echo -e "\033[32m +-------------回复PONG即可连通\033[0m"
else
echo -e "\033[31m +-------------Redis 服务未运行或未监听 ${REDIS_PORT} 端口\033[0m"
echo -e "\033[31m +-------------请尝试回滚并重试\033[0m"
fi
}
rollBack(){
rm -rfv /opt/redis
rm -rfv /usr/local/bin/redis*
rm -rfv /var/log/redis
rm -rfv //usr/lib/systemd/system/redis.service
}
compileInstall
checkConf
writeService
# 出现错误打开下方注释可清除目前安装进度
#rollBack
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端