0.前言
在Linux上搭建Redis并不是一件简单的事,官方只提供了源码,安装就首先需要事先下载gcc工具来编译,后续还包括一些安全事项,比如:绑定连接的IP、设置连接密码、设置Redis日志位置。
不过,在这里安装不会详细说明,网上有很多关于安装的资料,这里主要详细的说明一下配置和连接,比如:绑定连接的IP、设置连接密码、设置Redis日志位置等一切有相当实际意义的参数都会说明;同时也会介绍使用Unix domain Socket来连接,也会说明下自己在搭建时遇到的问题。
关于Redis的基本介绍,可以参考我的笔记 Redis学习笔记
1. 安装
1.1 安装说明
- 系统环境: CentOS 7.4.1708
- Redis版本:3.2.10
完整的安装过程需要gcc编译工具、和TCL(8.5以上版本)工具脚本语言
安装gcc-c
用gcc -v
看是否有输出来检测是否安装了gcc,可通过yum install gcc-c++
或gcc官网 下载压缩包解压
安装tcl8.5+(非必要)
Redis的make test命令需要tcl8.5+,通过https://sourceforge.net/projects/tcl/files/Tcl/,下载压缩包,然后需要编译安装,这里略过
详细安装过程可以参考下面的博客:Redis之在Linux上安装和简单的使用 - CSDN博客。
1.2 安装步骤
安装步骤按顺序主要包括下面的几个命令(make test可略过):1
2
3
4
5
6
7
8
9wget http://download.redis.io/releases/redis-3.2.10.tar.gz
tar zxvf redis-3.2.10.tar.gz
cd redis-3.2.10
make
cd src
make test
make PREFIX=/usr/local/redis install
cd ../
cp redis.conf /usr/local/redis
说明:
- Redis在2017年7月正式发布了Redis4,在不了解新特性之前,考虑到稳定性与安全性先使用Redis3;
- 第四步
make
是编译源码,该过程需要gcc工具,会输出很多编译信息; - 编译成功之后,进入src文件夹,进行第六步安装测试
make test
,该过程需要TCL8.5以上版本,可略过; - 第七步的安装,最好指定安装路径,方便以后的管理,这里选择
/usr/local/redis
; - 回到解压的根目录下,将配置文件
redis.conf
复制到安装路径下面,也是方便管理。
1.3 安装内容
安装完后,/usr/local/redis
路径下的内容1
2
3
4[root@Tomcat_Admin redis-3.2.10]# ll
total 52
drwxr-xr-x 2 root root 4096 Apr 22 22:16 bin
-rw-r--r-- 1 root root 46743 Apr 22 22:53 redis.conf
/usr/local/redis/bin
路径下的内容1
2
3
4
5
6
7
8[root@Tomcat_Admin bin]# ll
total 15108
-rwxr-xr-x 1 root root 2432584 Apr 22 22:16 redis-benchmark
-rwxr-xr-x 1 root root 25168 Apr 22 22:16 redis-check-aof
-rwxr-xr-x 1 root root 5191312 Apr 22 22:16 redis-check-rdb
-rwxr-xr-x 1 root root 2585448 Apr 22 22:16 redis-cli
lrwxrwxrwx 1 root root 12 Apr 22 22:16 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 5191312 Apr 22 22:16 redis-server
2. 配置
配置参数的设置是管理好Redis的关键。
配置文件缺省是解压文件夹根目录下的redis.conf
,上面的安装步骤已经将配置文件复制到安装路径下面。redis.conf
文件也可以在github上查看,实际上Redis的配置有很多,这里主要说明的常用的基本配置,即项目服务器和Redis在同一台机器上的模式,不包括主从、集群和扩展配置,详细的配置可以直接参考redis.conf中的注释。
下面的基本配置都是非常重要的配置,值得去记住,说明参考了:redis.conf文件详解 - CSDN博客
2.1 22条基本配置
bind
说明:绑定监听IP。如果只想让它在一个或多个网络接口上监听,那你就绑定一个IP或者多个IP。多个IP空格分隔即可。可以设置绑定测试环境的IP使之能够使用Redis桌面管理工具进行管理。当想让所有IP都能够访问server,则设置为0.0.0.0。
缺省配置:bind 127.0.0.1protected-mode
说明:当开启后,禁止公网访问redis。它启用的条件有两个,第一是没有使用bind,第二是没有设置访问密码。
缺省配置:protected-mode yesport
说明:指定该redis server监听的端口号。如果指定0则不监听。考虑到他人恶意攻击默认端口的可能性,可以设置成别的端口。
缺省配置:port 6379unixsocket
说明:指定 unix socket 的路径,缺省不使用。后面的连接会使用Unix Socket模式,所以这里要设置。
示例配置:unixsocket /tmp/redis.sockunixsocketperm
说明:指定 unix socket file 的权限,缺省不使用。后面的连接会使用Unix Socket模式,所以这里要设置。
示例配置:unixsocketperm 755timeout
说明:当客户端闲置多少秒后关闭连接,如果设置为0表示关闭该功能。
缺省配置:timeout 0daemonize
说明:是否以守护模式启动,配置为yes时以守护模式启动,这时redis instance会将进程号pid写入默认文件/var/run/redis.pid。当想Redis在后台运行时,设置为yes。
缺省配置:daemonize notcp-keepalive
说明:单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是300S
缺省配置:tcp-keepalive 300pidfile
说明:配置pid文件路径。当redis以守护模式启动时,如果没有配置pidfile,pidfile默认值是/var/run/redis.pid 。
缺省配置:pidfile /var/run/redis_6379.pidloglevel
说明:日志级别。可选项有:debug(记录大量日志信息,适用于开发、测试阶段); verbose(较多日志信息); notice(适量日志信息,使用于生产环境);warning(仅有部分重要、关键信息才会被记录)。
缺省配置:loglevel noticelogfile
说明:日志文件的位置,当指定为空字符串时,为标准输出,如果redis已守护进程模式运行,那么日志将会输出到 /dev/null 。输出到/dev/null就是没了!为了维护地方便,这里务必自己配置一个路径。
缺省配置:logfile “”databases
说明:设置数据库的数目。默认的数据库是DB 0 ,可以在每个连接上使用select <dbid>
命令选择一个不同的数据库,dbid是一个介于0到databases - 1 之间的数值。
缺省配置:databases 16dbfilename
说明:rdb文件的名字。缺省是redis启动命令执行的位置,dump.rdb文件请务必了解
缺省配置:dbfilename dump.rdb关于redis的dump.rdb文件
dump.rdb文件是redis快照的结果,也就是将数据库中是数据保存到硬盘中,防止redis意外重启后数据丢失的。redis每次启动时,都会先去找这个文件,将里面的数据导入数据库中,如果没有找到这个文件就会重新建立一个,如果找到了,但是被清空了,对不起,你的数据也就丢失了。配置文件中默认位置是,redis启动命令执行的位置。也就是,你在哪启动redis,这个文件就放在哪。一般我们会通过 CD 命令进入到redis的src或者bin目录来执行redis-server.exe,此时dump.rdb的位置就是src或bin;其保存时机由save
参数配置指定dir
说明:数据库(持久化)存放目录,也是dump.rdb存放的目录。必须是一个目录,aof文件也会保存到该目录下。
缺省配置:dir ./save
说明:保存数据到磁盘。格式是:save <seconds> <changes>
,含义是在 seconds 秒之后至少有 changes个keys 发生改变则保存一次。
缺省配置:1
2
3save 900 1
save 300 10
save 60 10000stop-writes-on-bgsave-error
说明:默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘, 否则就会没人注意到灾难的发生。 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。然而你要是安装了靠谱的监控,你可能不希望 redis 这样做,那你就改成 no 好了。
缺省配置:stop-writes-on-bgsave-error yesrdbcompression
说明:是否在dump.rdb数据库的时候压缩字符串,默认设置为yes。如果你想节约一些cpu资源的话,可以把它设置为no,这样的话数据集就可能会比较大。
缺省配置:rdbcompression yesrequirepass
说明:设置redis连接密码,默认不使用,很多时候我们为了测试环境能够连上服务器上的Redis而设置了bind 0.0.0.0,没有改变端口设置,更没有设置密码,为了你的Redis安全,请务必使用密码连接
示例配置:requirepass foobaredmaxmemory
解释: 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区,格式:maxmemory <bytes>
。当你需要占用很多内存时,请务必设置一个最大内存大小。
示例配置:maxmemory 1024000appendonly
说明:是否启用aof持久化方式 。即是否在每次更新操作后进行日志记录,默认配置是no,即在采用异步方式把数据写入到磁盘,如果不开启,可能会在断电时导致部分数据丢失。如果拿Redis当Cache用,一般不会用到aof持久化
缺省配置:appendonly no关于redis的appendonly.aof文件
Append-only file,将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。AOF相对可靠,它和mysql中bin.log、apache.log、zookeeper中txn-log简直异曲同工。AOF文件内容是字符串,非常容易阅读和解析。appendfilename
解释:更新日志文件名。文件在 dir参数 指定的目录下
缺省配置:appendfilename appendonly.aofappendfsync
解释:aof文件刷新的频率。有三种:
1) no 依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差。
2) always 每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全。
3) everysec 每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据。缺省配置:appendfsync everysec
- 关于上述提到的.rdb和.aof文件,即Redis持久化存储(AOF与RDB两种模式),可以参考以下文章:Redis持久化存储(AOF与RDB两种模式)_数据库技术_Linux公社-Linux系统门户网站或者参考我的笔记Redis——学习笔记
3. 启动
配置好redis.conf
,就可以启动Redis,实际上也应该是先配置好redis.conf
再去启动,启动需要安装后的文件夹下面的redis-server
程序,所以需要cd到bin文件夹下。
- 关于bin下面的可执行文件:
– | 可执行文件 | 说明 |
---|---|---|
1 | redis-server | 启动redis |
2 | redis-cli | redis命令行工具 |
3 | redis-benchmark | 基准测试工具 |
4 | redis-check-aof | AOF持久化文件检测工具和修复工具 |
5 | redis-check-dump | RDB持久化文件检测工具和修复工具 |
6 | redis-sentinel | 启动redis-sentinel |
3.1 启动方式
关于启动方式先来看下面一张图:
./redis-server
直接启动,会去相同目录下寻找redis.conf
文件,找不到则按默认参数启动,IP:127.0.0.1:6379./redis-server ../redis.conf
指定配置文件启动./redis-server ../redis.conf --port 6380
可以同时指定其他参数,当指定了配置文件后,又显示指定了其他的参数,若配置文件中也指定了参数时,以显示指定的参数为主。
3.2 注意点
- 个人认为,最好显示指定配置文件来启动,即
./redis-server ../redis.conf
,以免出现意料之外的情况。 - 直接使用
./redis-server
默认是前台启动,2. 配置中已经说明过了,要想后台启动,需要修改redis.conf
中的daemonize
参数,设置为daemonize yes
。若使用了前台启动,可以通过ctrl + c退出
3.3 配置环境变量
若不想每次启动或连接都cd到redis/bin文件夹下,可以配置环境变量。
在
/etc/profile.d/
下新增一个redis.sh
文件1
vim /etc/profile.d/redis.sh
输入导入命令,然后保存退出(按Esc,再按wq + 回车)
1
2export REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/bin载入文件,使之生效
1
source /etc/profile.d/redis.sh
3.4 启动脚本
如果想更懒一点的话,可以写一个启动脚本,也可以同时配置好开机启动Redis,这里不详细说明。详细请参考centos 7 添加 redis 3.2.9 开机启动脚本
3.5 遇到的问题
安装成功后,我曾一度无法开启Redis服务器,输入./redis-server ../redis.conf
并没有任何的输出,进程也没有Redis,这时候果然要根据redis.conf
中设置好的日志文件去查看启动情况:(注意,如果设置了后台启动又没设置日志文件位置,是不会有日志文件!)
redis.conf1
logfile /var/log/redis_18800.log
redis_18800.log1
12226:C 22 Apr 22:38:15.872 # Can't chdir to '/var/lib/redis/18800': No such file or directory
结果表示,是redis.conf
中的一项用于存放rdb文件的dir /var/lib/redis/18800
文件夹不存在,Redis并不会帮我们自动创建,手动创建一个就好了。
4. 连接
Redis的连接主要分为3种
- 命令行客户端连接,即安装后文件夹中的
redis-cli
连接程序; - 远程桌面连接,比如Redis桌面管理可视化工具Redis Desktop Manager、TreeDMS;
- 项目客户端连接,如Java客户端Jedis、JRedis、Lettuce。
4.1 客户端连接
Redis自带的命令行客户端程序redis-cli
./redis-cli
,最直接连接的方式,默认是IP:127.0.0.1:6379./redis-cli -h 127.0.0.1 -p 6379
,带参数的连接,常指定host和port。这里也可以在测试环境(比如Windows)中下载一个Redis,使用该命令来连接到服务器上的Redis./redis-cli -s /tmp/redis.sock
,使用socket进行连接,需要事先在redis.conf
设置好unixsocket
和unixsocketperm
的值,使用socket的条件是客户端和服务端在统一服务器上,好处是比起使用TCP/IP连接,拥有更高的执行效率./redis-cli -a yourpassword
,如果配置了密码,可以使用密码连接,也可以不在这里输入密码,而在连接成功之后使用函数auth yourpassword
,看见命令行返回OK即代表认证成功。
4.2 远程桌面连接
这里使用Redis Desktop Manager来演示,下载地址Redis Desktop Manager
双击运行,点击下方的Connect to Redis Server,输入相关信息即可,auth表示密码(非必须)
4.3 远程连接注意点
事实上,往往会出现远程无法连接的状况,大致原因有:
redis.conf
文件没有设置好bind
参数,要使外网能够访问,设置为bind 0.0.0.0
,然后重新启动Redis,注意,如果设置了bind 0.0.0.0
一定要设置密码,否则很不安全;- 服务器上的防火墙拦截了连接(即使关了,也可能需要再开启设置好规则),CentOS 7开启对应端口的相关操作如下:
firewall-cmd --state ##查看防火墙状态,是否是running
firewall-cmd --zone=public --list-ports ##查看所有打开的端口
firewall-cmd --add-port=6379/tcp --permanent ##永久添加6379端口
firewall-cmd --reload ##重新载入配置,比如添加规则之后,需要执行此命令
- 如果使用的是企业的云服务器,比如腾讯云、阿里云服务器,也可能是企业提供的防火墙(安全组)拦截了连接,登录后去控制台设置好访问规则即可;
- 如果设置了密码,要在Redis Desktop Manager的Auth项填入密码,另外,不需要在Redis Desktop Manager设置服务器的用户信息,密码或密钥都是不需要的,只要开放了端口,外网就能访问对应端口的程序;
- 服务端没有正常开启,在服务器上使用命令
ps -ef | grep redis
,若只有简单的一行输出,说明Redis没有开启,参考 3.5 使用日志查看启动信息。
5. 总结
Redis的安装、配置、使用到此结束,下一篇文章会介绍在Spring项目中使用Java客户端Lettuce,运用Unix Socket和TCP两种方式连接Redis。
Copyright © 2018, GDUT CSCW back-end Kanarien, All Rights Reserved