一、前言
Redis官方下载地址:https://redis.io/download/#redis-downloads
本教程参考官方文档,在云服务器Centos7上安装部署最新稳定版Redis-7.0.5,有些地方有坑,笔者也是一边踩坑一边填坑,教程内容里面会有说明。本文和其它博文不太一样,其它博文可能只“照猫(网络上的博文)画虎”,天下内容一片抄,本文即使是“画虎”,也是按照“猫(官方文档)”的哪些部位去详细地描绘。笔者意在写最好的最新稳定版Redis7安装教程。
如需了解Docker中的最新稳定版Redis安装部署,可参考教程【Docker安装最新稳定版Redis7(redis-7.0.5)(参考官方文档)】。
如需了解Centos7下最新稳定版Redis6安装部署,可参考教程【写最好的最新Redis6(redis-6.2.7)在云服务器Centos7安装部署教程(参考官方文档)】。
本文由 @大白有点菜 原创,请勿盗用,转载请说明出处!如果觉得文章还不错,请点点赞,加关注,谢谢!
二、安装部署
连接云服务器需要一些工具,笔者用的是 Xshell 7 ,如需要安装,可参考教程【Xshell7安装教程】。
Redis官方安装文档教程:https://redis.io/docs/getting-started/
1、下载源码包方法一(不推荐
):通过上传源码包方式,上传 redis-stable.tar.gz 到目录 /usr/software/redis/ 。
(1)参数 -p
代表多级目录递归,指令 mkdir
代表新建目录,存在 software 和 redis 目录就忽略,不存在就新建:
mkdir -p /usr/software/redis
(2)切换到 /usr/software/redis/
cd /usr/software/redis/
(3)上传命令:
rz
如果提示 rz 命令不存在,需要安装相应组件:
yum -y install lrzsz
2、下载源码包方法二(推荐
):通过wget
或curl
下载源码包 。
(1)参数 -p
代表多级目录递归,指令 mkdir
代表新建目录,存在 software 和 redis 目录就忽略,不存在就新建:
mkdir -p /usr/software/redis
(2)切换到 /usr/software/redis/
cd /usr/software/redis/
(3)wget
或 curl
两种方式下载源码包,选其中一种即可。
wget https://download.redis.io/redis-stable.tar.gz
或
curl -O https://download.redis.io/redis-stable.tar.gz
3、解压到 /usr/local/
目录,解压出来的文件夹为 redis-stable
。
tar -xzf /usr/software/redis/redis-stable.tar.gz -C /usr/local/
4、编译源码。这里有两种方式,笔者推荐方式一。方式二当然也没有问题,只不过后面教程有些步骤稍微麻烦一点点,需要多一步处理。官方源码包中有个 README.md
说明文件,里面介绍了如何编译源码。
(1)看看 README.md 文件里有关编译源码的注意事项。
vim /usr/local/redis-stable/README.md
直接使用 make 命令
编译 Redis 源码,会在src
目录下生成redis-server
和redis-cli
可执行文件。- 如果在
make 命令后面添加 install
参数编译 Redis 源码,则会在/usr/local/bin/
目录下生成redis-server
和redis-cli
可执行文件,而不是在 src 目录下生成。
(2)方式一(推荐
):会在 /usr/local/bin
目录下生成可执行文件 redis-server
和 redis-cli
,即编译成功的同时进行安装(install)。
1)查看 /usr/local/bin 目录的文件情况,redis-server 和 redis-cli 可执行文件是不存在的。
ll /usr/local/bin
2)使用 make install
编译Redis源码所在的目录 /usr/local/redis-stable/ ,会在 /usr/local/bin 目录下编译生成 redis-server 和 redis-cli 可执行文件。笔者发现,同时也会在Redis源码包下 src 目录下生成同样的文件。
make -C /usr/local/redis-stable/ install
(3)方式二(也可以,没有方式一优
):只在 redis-stable 目录下的 src
目录生成主要的 redis-cli
和 redis-server
可执行文件,并不进行安装(install)。
make -C /usr/local/redis-stable/
5、【重要
】创建一个用于存储 Redis 配置文件目录(/etc/redis
)和数据目录(/var/redis
)。
sudo mkdir /etc/redis
sudo mkdir /var/redis
6、新建开机自启脚本文件 redis_6379
。官方教程是从 utils 目录里拷贝 redis_init_script 并重命名为 redis_6379 文件,在某些情况下存在问题,笔者在此基础上对其进行了修改,并说明要修改的地方和原因。
(1)如果前面编译源码是按照方式一进行的,可以忽略此处说明,只有按照方式二进行才需要仔细看。先来说明 redis_6379
脚本文件中 EXEC
和 CLIEXEC
这两个参数要注意的地方。
官方初始化脚本 redis_init_script 中, EXEC 代表要执行二进制文件 redis-server 的绝对路径
,CLIEXEC 代表要执行二进制文件 redis-cli 的绝对路径
。 默认 EXEC 的值为 /usr/local/bin/redis-server ,默认 CLIEXEC 的值为 /usr/local/bin/redis-cli 。如下:
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
但是,默认在 /usr/local/bin/ 目录下没有 redis-server 和 redis-cli 这两个可执行文件
,如果使用该 redis_6379 脚本文件去运行 redis-server 和 redis-cli ,肯定会报错。那怎么解决呢?官方教程中也说到,需要从前面编译出来的 redis-server 和 redis-cli 复制到 /usr/local/bin/ 目录。官方为什么要在 /usr/local/bin/ 去执行 redis-server 和 redis-cli 呢?因为这样配置后,在任何目录都能运行 redis-server 和 redis-cli ,和配置全局路径的效果一样!
cp /usr/local/redis-stable/src/redis-server /usr/local/bin/
cp /usr/local/redis-stable/src/redis-cli /usr/local/bin/
有些博文是直接配置 redis-server 和 redis-cli 的绝对路径,虽然这种方法可行,但是不建议这么做
,有两点原因:1、限制了 redis-server 和 redis-cli 只能在它们所在的目录下运行,无法做到全路径运行,当然啦,可以在 profile 文件中配置全局路径实现全路径运行,这样太麻烦,维护困难。2、如果升级Redis版本,还得修改脚本文件 redis_6379 中 EXEC
和 CLIEXEC
这两个参数值,耦合度高,维护麻烦。
EXEC=/usr/local/redis-stable/src/redis-server
CLIEXEC=/usr/local/redis-stable/src/redis-cli
(2)官方的做法(不推荐,存在问题
)
1)将 redis-stable
目录下的 utils 目录
下的初始化脚本 redis_init_script
复制一份到 /etc/init.d
目录里,同时修改为 redis_6379
。
sudo cp /usr/local/redis-stable/utils/redis_init_script /etc/init.d/redis_6379
2)从 redis_init_script 脚本文件模板复制出来 redis_6379 脚本文件有哪些隐藏的问题?
只有启动(start)和 停止(stop)
两种方式,没有重启(restart)
方式,而我们更多会用到重启(restart)。- 在后面的步骤中会设置
6379.conf 配置文件
,如果设置到密码(参数 requirepass
)允许 redis-cli 去连接 redis-server ,官方使用sudo /etc/init.d/redis_6379 start
命令启动 redis-cli 和 redis-server,按道理使用sudo /etc/init.d/redis_6379 stop
命令去停止 redis-cli 和 redis-server 运行没有任何问题。
- 但是,笔者在测试时,发现报错了,报错日志大概意思是错误的认证,等待 Redis 关闭。就是说,如果没有设置到密码,是不会报下面的错误的。
(3)笔者在原始脚本上做了修改(推荐
):不用按官方的方式复制一份 redis_init_script 并重命名,直接新建 redis_6379 初始化脚本文件,分为 没有设置密码 和 设置密码 两种情况。
vim /etc/init.d/redis_6379
没有设置
Redis默认用户密码
的情况。新增restart
脚本内容。
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
### BEGIN INIT INFO
# Provides: redis_6379
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Redis data structure server
# Description: Redis data structure server. See https://redis.io
### END INIT INFO
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart)
"$0" stop
sleep 3
"$0" start
;;
*)
echo "Please use start or stop as first argument"
;;
esac
设置
Redis默认用户密码
的情况。新增restart
脚本内容。文件内容中【$CLIEXEC -p $REDISPORT shutdown】修改为【$CLIEXEC -p $REDISPORT -a 123456 shutdown】,参数 -a 代表认证,123456 代表Redis默认用户密码,后面步骤会修改配置文件 6379.conf 对应的 requirepass 参数的值
,密码只是举例,实际上不要设置这么简单,不安全 。
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
### BEGIN INIT INFO
# Provides: redis_6379
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Redis data structure server
# Description: Redis data structure server. See https://redis.io
### END INIT INFO
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT -a 123456 shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart)
"$0" stop
sleep 3
"$0" start
;;
*)
echo "Please use start or stop as first argument"
;;
esac
7、复制 redis-stable 目录下的模板配置文件 redis.conf
到 /etc/redis
目录下,同时重命名为 6379.conf
。
sudo cp /usr/local/redis-stable/redis.conf /etc/redis/6379.conf
8、在 /var/redis
目录中创建一个目录 6379
,该目录将用作 Redis 的数据和工作目录。
sudo mkdir /var/redis/6379
9、方法一(参数细节说明值得一看,操作麻烦些
)修改配置文件6379.conf参数默认值:使用vim修改配置文件 /etc/redis/6379.conf
。
(1)编辑 6379.conf
文件。
vim /etc/redis/6379.conf
(2)修改参数值。注意
:6379.conf 配置文件有2276行,要找到指定参数位置不方便,可以通过行号快速跳转。要想了解如何设置显示行号和跳转,请参考教程【Linux中vim编辑文件显示行号(临时和永久两种方式)】和【Linux中vim编辑文件跳转指定的行和列】。此处有操作个小技巧
:按 i
键进入到编辑模式,修改内容后,再按 Esc
键切换到正常模式,输入 ngg
跳转到第n行(n代表行号
),例如跳转到第66行,即 66gg ,继续按 i 键进入到编辑模式修改下一部分内容。最后记得输入 :wq
保存并退出。
行号 87
,原内容【bind 127.0.0.1 -::1】。默认只支持 redis-cli 本地连接 redis-server ,不支持远程连接,例如第三方工可视化具 RESP(旧版叫 Redis Desktop Manager)。【支持远程连接参数值修改如下】
。
bind * -::*
行号 138
,原内容【port 6379】。官方默认端口号就是6379
,此处可以改为别的端口,但是不建议这么做,使用官方的默认值是最好的。如果修改端口,记得也要修改/etc/init.d/
下的redis_6379
文件里面的参数“REDISPORT
”的值为要修改的端口。【这个参数不用修改,如果修改端口了,需要修改一大堆关联的文件的参数值!】
。
port 6379
行号 309
,原内容【daemonize no】。默认值no
会禁止 redis-server 在守护进程(后台)中运行。【需要修改为 yes】
。
daemonize yes
行号 341
,原内容【pidfile /var/run/redis_6379.pid】。当 server 是在守护进程中运行才会使用到 redis_6379.pid 文件,会将程序的pid
写入到此文件中,可以用来停止 redis-sever 进程。【注意
:如果上面的端口6379修改了,这个pid文件也要修改为redis_修改的端口.pid
样式的文件,因为/etc/init.d/
下的redis_6379
文件中,参数“PIDFILE
”的作用和此处的参数配置作用是一样的,两者需要配置统一,所以不要随意修改端口!】。【这个参数不用修改】
。
pidfile /var/run/redis_6379.pid
行号 349
,原内容【loglevel notice】。有4个日志级别:debug(调试)、verbose(冗长的)、notice(公告)、warning(警告),默认是notice级别的,生产环境使用notice级别。需要调试就使用 debug 或 verbos 级别。【这个参数不用修改】
。
loglevel notice
行号 354
,原内容【logfile “”】。【这个参数修改为日志文件的路径】
。
logfile /var/log/redis_6379.log
行号 504
,原内容【dir ./】。【这个参数修改为要存放的数据目录】
。
dir /var/redis/6379
行号 1036
,原内容【# requirepass foobared】。给默认用户设置密码,主要是使用 redis-cli 连接 redis-server时,需要通过密码校验。配置文件默认是注释这个参数的,代表无密码连接。在云服务器上安装Redis,肯定要设置Redis用户密码。此处 123456 密码过于简单,不建议这么做,很不安全。【此处参数修改为指定的密码,设置的密码不能包含一些特殊字符,如 # & $ 三个,因为初始化脚本 redis_6379 使用这些字符会使Redis服务的stop功能失效,笔者在这里踩了坑。经过验证,包含 @ % * 这三个字符是没有问题的】
。
requirepass 123456
10、方法二(参数细节说明请看方法一,操作简单
)修改配置文件6379.conf参数默认值:使用sed替换配置文件 /etc/redis/6379.conf
中参数默认的值。反斜杠“\
”代表转义符,即将某些特殊字符转义。
(1)行号 87
,原内容【bind 127.0.0.1 -::1】。
sed -i 's/bind 127.0.0.1 -::1/bind * -::*/' /etc/redis/6379.conf
(2)行号 309
,原内容【daemonize no】。
sed -i 's/daemonize no/daemonize yes/' /etc/redis/6379.conf
(3)行号 354
,原内容【logfile “”】。
sed -i 's/logfile \"\"/logfile \/var\/log\/redis_6379.log/' /etc/redis/6379.conf
(4)行号 504
,原内容【dir ./】。
sed -i 's/dir \.\//dir \/var\/redis\/6379/' /etc/redis/6379.conf
(5)行号 1036
,原内容【# requirepass foobared】。如果Redis是部署到云服务器上,不要设置 123456 这么简单的密码,不安全。此处最好看看方法一中的红色字体注意事项。
sed -i 's/\# requirepass foobared/requirepass 123456/' /etc/redis/6379.conf
11、设置开机启动执行 redis_6379 初始化脚本文件,方式有两种,官方的方式在Centos系统下会报错。
(1)推荐的一种方式(Centos下可行
):rc.local 文件里写入执行redis_6379初始化脚本的指令。一定要更改 /etc/rc.d/rc.local
文件为 可执行(x)权限
,默认 /etc/rc.d/rc.local 没有可执行(x)权限,即使软链接 /etc/rc.local 有可执行(x)权限也没有用,不然开机是无法自启动Redis服务的,笔者在这里踩了坑。其实 /etc/rc.local 只是 /etc/rc.d/rc.local 的软链接
。
- rc.local 文件里写入执行redis_6379初始化脚本的指令:
echo "sudo /etc/init.d/redis_6379 start &" >> /etc/rc.local
- 更改
/etc/rc.d/rc.local
文件为 可执行(x)权限,默认是没有的:
chmod +x /etc/rc.d/rc.local
(2)官方文档提到的方式(Centos下似乎不可行
):使用 update-rc.d
命令添加Redis初始化脚本(redis_6379)到默认运行级别。需要安装包含 update-rc.d 功能的相关组件,查阅资料得知,file-rc、sysv-rc、init-system-helpers 都存在 update-rc.d ,可能只限于Debian系统和Ubuntu系统,笔者试过使用 yum 来下载,提示没有可用的包。
sudo update-rc.d redis_6379 defaults
12、执行 redis_6379 初始化脚本文件:启动(start)、重启(restart)、停止(stop)。
(1)启动(start)
sudo /etc/init.d/redis_6379 start
(2)重启(restart)
sudo /etc/init.d/redis_6379 restart
(3)停止(stop)
sudo /etc/init.d/redis_6379 stop
四、连接测试
1、使用 redis-cli 本地连接测试
(1)使用 redis-cli
命令连接 redis-server,使用 ping
测试,发现需要密码验证。
redis-cli
(2)输入 auth 123456
,验证密码,返回OK代表验证通过。
auth 123456
(3)继续 ping
,返回 PONG 代表验证和 redis-server 正常连接。
auth 123456
2、使用第三方可视化工具 RESP
(旧版叫 Redis Desktop Manager
) 远程连接测试
(1)因为使用的是云服务器Centos7,所以需要在安全组中**开放 6379 端口
,读者可以根据自己的云服务器的安全组规则来设置,不同品牌的云服务器设置不一样,但原理是相通的。如果使用虚拟机安装的Centos7,可以关闭防火墙或者设置过滤端口,虚拟机中的Centos7建议不要关闭防火墙。云服务器Centos7禁止关闭防火墙。可参考教程【Centos中防火墙(Firewall)操作(允许端口、删除端口、查看端口列表、重启、停止、开机启动等)**】。
(2)使用 RESP 工具连接,输入IP和密码,测试连接是正常。
五、总结
1、安装部署中都很详细地说明Redis安装细节和注意事项,特别是设置Redis默认用户密码那一块,不能包含某些特殊字符,目前笔者只验证那特殊6个字符。
2、如果使用 kill -9 pid
的方式强制关闭 redis-server
,再次启动会报 pid 文件存在的错误,使用 rm -rf
命令强制删除redis_6379.pid
即可。
rm -rf /var/run/redis_6379.pid