## 【动力节点】Redis入门到高级教程,全网最新最全redis缓存教程,redis百科大全
2 Redis的安装与配置
这里是要将Redis安装到Linux系统中。
2.1 Redis的安装
2.1.1 克隆并配置主机
- 修改主机名:/etc/hostname
- 修改网络配置:/etc/sysconfig/network-scripts/ifcfg-ens33
2.1.2 安装前的准备工作
2.1.2.1 安装gcc
由于Redis是由C/C++语言编写的,而从官网下载的Redis安装包是需要编译后才可安装的,所以对其进行编译就必须要使用相关编译器。对于C/C++语言的编译器,使用最多的是gcc与gcc-c++,而这两款编译器在CentOS7中是没有安装的,所以首先要安装这两款编译器。
GCC,GNU Compiler Collection,GNU编译器集合。
2.1.2.2 下载Redis
redis的官网为: http://redis.io。点击下面的链接可以直接进行下载。
2.1.2.3 上传到Linux
将下载好的压缩包上传到Linux的/opt/tools目录中。
2.1.3 安装Redis
2.1.3.1 解压Redis
将Redis解压到/opt/apps目录中。
进入到/opt/apps目录中再将Redis解压包目录更名为redis(不更名也无所谓)。
2.1.3.2 编译
编译过程是根据Makefile文件进行的,而Redis解压包中已经存在该文件了。所以可以直接进行编译了。
进入到解压目录中,然后执行编译命令make。
当看到如下提示时,表示编译成功。
2.1.3.3 安装
在Linux中对于编译过的安装包执行make install进行安装。
可以看到,共安装了三个组件:redis服务器、客户端与一个性能测试工具benchmark。
2.1.3.4 查看bin目录
安装完成后,打开/usr/local/bin目录,可以看到出现了很多的文件。
通过echo $PATH可以看到,/usr/local/bin目录是存在于该系统变量中的,这样这些命令就可以在任意目录中执行了。
2.1.4 Redis启动与停止
2.1.4.1 前台启动
在任意目录执行redis-server命令即可启动Redis。这种启动方式会占用当前命令行窗口。
再开启一个会话窗口,可以查看到当前的Redis进程,默认端口号为6379。
通过Ctrl + C命令可以停止Redis。
2.1.4.2 命令式后台启动
使用nohub命令,最后再添加一个&符,可以使要启动的程序在后台以守护进程方式运行。这样的好处是,进程启动后不会占用一个会话窗口,且其还会在当前目录,即运行启动命令的当前目录中创建一个nohup.out文件用于记录Redis的操作日志。
2.1.4.3 Redis的停止
通过redis-cli shutdown命令可以停止Redis。
2.1.4.4 配置式后台启动
使用nohup命令可以使Redis后台启动,但每次都要键入nohup与&符,比较麻烦。可以通过修改Linux中Redis的核心配置文件redis.conf达到后台启动的目的。redis.conf文件在Redis的安装目录根下。
将daemonize属性值由no改为yes,使Redis进程以守护进程方式运行。
修改后再启动Redis,就无需再键入nohup与&符了,但必须要指定启动所使用的Redis配置文件。这是为什么呢?
使用nohup redis-server &命令启动Redis时,启动项中已经设置好了Redis各个参数的默认值,Redis会按照这些设置的参数进行启动。但这些参数是可以在配置文件中进行修改的,修改后,需要在启动命令中指定要加载的配置文件,这样,配置文件中的参数值将覆盖原默认值。
Redis已经给我们提供好了配置文件模板,是Redis安装目录的根目录下的redis.conf文件。由于刚刚对redis.conf配置文件做了修改,所以在开启Redis时需要显示指出要加载的配置文件。配置文件应紧跟在redis-server的后面。
2.2 连接前的配置
Redis是一个内存数据库服务器,就像MySQL一样,对其操作也需要通过客户端进行。若要使远程主机上的客户端能够连接并访问到服务端的Redis,则服务端首先要做如下配置。
2.2.1 绑定客户端IP
Redis可以通过修改配置文件来限定可以访问自己的客户端IP。
以上设置后,只允许当前主机访问当前的Redis,其它主机均不可访问。所以,如果不想限定访问的客户端,只需要将该行注释掉即可。
2.2.2 关闭保护模式
默认保护模式是开启的。其只允许本机的客户端访问,即只允许自己访问自己。但生产中应该关闭,以确保其它客户端可以连接Redis。
2.2.3 设置访问密码
为Redis设置访问密码,可以对要读/写Redis的用户进行身份验证。没有密码的用户可以登录Redis,但无法访问。
2.2.3.1 密码设置
访问密码的设置位置在redis.conf配置文件中。默认是被注释掉的,没有密码。
没有通过密码登录的用户,无法读/写Redis。
2.2.3.2 使用密码
对于密码的使用,有两种方式:登录时未使用密码,则访问时先输入密码;登录时直接使用密码登录,访问时无需再输入密码。
2.2.3.2.1 登录时未使用密码
2.2.3.2.2 登录时使用密码
2.2.3.2.3 退出时使用密码
2.2.3.3 注意
为了方便后面的学习,我们这里就不设置访问密码了,直接将其注释掉即可。
2.2.4 禁止/重命名命令
后面要学习两个非常危险的命令:flushal与flushdb。它们都是用于直接删除整个Redis数据库的。若让用户可以随便使用它们,可能会危及数据安全。Redis可以通过修改配置文件来禁止使用这些命令,或重命名这些命令。以下配置,禁用了flushall与flushdb命令。
当然,在学习过程中暂时不禁用它们。
2.2.5 启动Redis
当然,若要使客户端能够连接Redis,则必须开启服务端的Redis。
2.3 Redis客户端分类
Redis客户端也像MySQL客户端一样有多种类型:命令行客户端、图形界面客户端、Java代码客户端。
2.3.1 命令行客户端
Redis提供了基本的命令行客户端。打开命令行客户端的命令为redis-cli。
- -h:指定要连接的Redis服务器的IP。
- -p:指定要连接的Redis的端口号。
若连接的是本机Redis,且端口号没有改变,保持默认的6379,则-h与-p选项可以省略不写。
2.3.2 图形界面客户端
2.3.2.1 Redis Desktop Manager
Redis的图形界面客户端很多,其中较出名的是Redis Desktop Manager的客户端。
2.3.2.2 RedisPlus
RedisPlus是为Redis可视化管理开发的一款开源免费的桌面客户端软件,支持Windows 、Linux、Mac三大系统平台,RedisPlus提供更加高效、方便、快捷的使用体验,有着更加现代化的用户界面风格。
2.3.3 Java代码客户端
所谓Java代码客户端就是一套操作Redis的API,其作用就像JDBC一样,所以Java代码客户端其实就是一个或多个Jar包,提供了对Redis的操作接口。 对Redis操作的API很多,例如jdbc-redis、jredis等,但最常用也是最有名的是Jedis。
2.4 Redis配置文件详解
Redis的核心配置文件redis.conf在安装根目录下,默认包含2000多行。这些内容根据功能被划分为了很多部分。下面将一些重要部分进行介绍。
2.4.1 基础说明
这部分主要是给出一些说明,包含三部分意思:
- 第1-6行用于说明,如果要启动Redis,需要指出配置文件的路径。
- 第8-16行用于说明当前配置文件中可以使用的的容量单位及意义。
- 第18行用于说明这些容量单位没有大小写之分。
2.4.2 includes
指定要在当前配置文件中包含的配置文件。这样做的目的主要是便于配置信息管理:可以将不同场景的配置都进行单独定义,然后在当前核心配置文件中根据不同场景选择包含进不同的配置文件。
2.4.3 modules
Redis配置文件中可以通过加载不同的第三方模块,来增强、扩展Redis的功能。
2.4.4 network
Network配置模块是比较重要的部分,主要进行网络相关的配置。其中较重要的有:
2.4.4.1 bind
指定可以访问当前Redis服务的客户端IP,默认只允许本地访问,即当前Redis自己访问自己。为了使所有其它客户端都可访问,一般要将其注释掉。
2.4.4.2 protected-mode
默认保护模式是开启的。其只允许本机的客户端访问,即只允许自己访问自己。但生产中应该关闭,以确保其它客户端可以连接Redis。
2.4.4.3 port
Redis监听的连接端口号,默认6379。
2.4.4.4 tcp-backlog
tcp-backlog是一个TCP连接的队列,其主要用于解决高并发场景下客户端慢连接问题。这里设置的值就是这个队列的长度。该队列与TCP连接的三次握手有关。不同的Linux内核,backlog队列中存放的元素(客户端连接)类型是不同的。
- Linux内核2.2版本之前,该队列中存放的是已完成了第一次握手的所有客户端连接,其中就包含已完成三次握手的客户端连接。当然,此时的backlog队列中的连接也具有两种状态:未完成三次握手的连接状态为SYN_RECEIVED,已完成三次握手的连接状态为ESTABLISHED。只有ESTABLISHED状态的连接才会被Redis处理。
- Linux内核2.2版本之后TCP系统中维护了两个队列:SYN_RECEIVED队列与ESTABLISHED队列。SYN_RECEIVED队列中存放的是未完成三次握手的连接,ESTABLISHED队列中存放的是已完成三次握手的连接。此时的backlog就是ESTABLISHED队列。
查看Linux内核版本:
TCP中的backlog队列的长度在Linux中由内核参数somaxconn来决定。所以,在Redis中该队列的长度由Redis配置文件设置与somaxconn来共同决定:取它们中的最小值。
查看当前Linux内核中somaxconn的值。
生产环境下(特别是高并发场景下),backlog的值最好要大一些,否则可能会影响系统性能。
修改/etc/sysctl.conf文件,在文件最后添加如下内容:
修改过后可以重启虚拟机,也可以通过执行如下命令来使新的修改生效。
2.4.4.5 timeout
空闲超时。当客户端与Redis间的空闲时间超过该时长后,连接自动断开。单位秒。默认值为0,表示永远不超时。
2.4.4.6 tcp-keepalive
该配置主要用于设置Redis检测与其连接的所有客户端的存活性时间间隔,单位秒。一般是在空闲超时timeout设置为0时进行配置。
2.4.5 general
2.4.5.1 daemonize
该配置可以控制Redis启动是否采用守护进程方式,即是否是后台启动。yes是采用后台启动。
2.4.5.2 pidfile
该配置用于指定Redis运行时pid写入的文件,无论Redis是否采用守护进程方式启动,pid都会写入到该配置的文件。
注意,如果没有配置pid文件,不同的启动方式,pid文件的产生效果是不同的:
- 采用守护进程方式启动(后台启动,daemonize为yes):pid文件为/var/run/redis.pid。
- 采用前台启动(daemonize为no):不生产pid文件
2.4.5.3 loglevel
配置日志的级别。Redis中共有四个级别,由低到高依次是:
- debug:可以获取到很多的信息,一般在开发和测试时使用。
- verbose:可以获取到很多不太有用的信息,但不像debug级别那么多。
- notice:可以获取到在生产中想获取到的适当多的信息,默认级别。
- warning:只记录非常重要/关键的信息。
2.4.5.4 logfile
指定日志文件。如果设置为空串,则强制将日志记录到标准输出设备(显示器)。如果使用的是守护进程启动方式,设置为空串,则意味着会将日志发送到设备/dev/null(空设备)。
2.4.5.5 databases
设置数据库的数量。默认数据库是0号数据库。可以使用select <dbid>在每个连接的基础上选择一个不同的数据库,其中dbid是介于0和'databases'-1'之间的数字。
2.4.6 security
用户设置ACL权限、Redis访问密码相关配置。该模块中最常用的就是requirepass属性。
设置客户端访问密码。注释掉后则没有密码。
2.4.7 clients
该模块用于设置与客户端相关的属性,其中仅包含一个属性maxclients。
maxclients用于设置Redis可并发处理的客户端连接数量,默认值为10000。如果达到了该最大连接数,则会拒绝再来的新连接,并返回一个异常信息:已达到最大连接数。
注意,该值不能超过Linux系统支持的可打开的文件描述符最大数量阈值。查看该阈值的方式如下。修改该值,可以通过修改/etc/secutiry/limits.conf文件(自己查)。
2.4.8 memory management
该配置可以控制最大可用内存及相关内容移除问题。
2.4.8.1 maxmemory
将内存使用限制设置为指定的字节数。当达到内存限制时,Redis将根据选择的逐出策略maxmemory-policy尝试删除符合条件的key。
如果不能按照逐出策略移除key,则会给写操作命令返回error,但对于只读的命令是没有影响的。
2.4.8.2 maxmamory-policy
该属性用于设置,当达到maxmemory时,Redis将如何选择要移除的内容。当然,如果没有符合相应策略的内容要删除,则在执行写入命令时会给出errors的响应。Redis中共支持8种移除策略:
- volatile-lru:使用近似LRU算法移除,仅适用于设置了过期时间的key。
- allkeys-lru:使用近似LRU算法移除,可适用于所有类型的key。
- volatile-lfu:使用近似LFU算法移除,仅适用于设置了过期时间的key。
- allkeys-lfu:使用近似LFU算法移除,可适用于所有类型的key。
- volatile-random:随机移除一个key,仅适用于设置了过期时间的key。
- allkeys-random:随机移除一个key,可适用于所有类型的key。
- volatile-ttl:移除距离过期时间最近的key。
- noeviction:不移除任何内容,只是在写操作时返回一个错误,默认值。
2.4.8.3 maxmemory-samples
该属性用于指定挑选要删除的key的样本数量。样本的选择采用的是LRU算法,其不能修改。但从样本中再选择要移除的key,则采用的是maxmamory-policy指定的策略。
2.4.8.4 maxmemory-eviction-tenacity
设置移除容忍度。数值越小表示容忍度越低,需要移除的数据移除延迟越小;数值越大表示容忍度越高,需要移除的数据移除延迟越大。
2.4.9 threaded I/O
该配置模块用于配置Redis对多线程IO模型的支持。
2.4.9.1 io-threads
该属性用于指定要启用多线程IO模型时,要使用的线程数量。
查看当前系统中包含的CPU数量:
2.4.9.2 io-threads-do-reads
该属性用于启用多线程IO模型中的多线程处理读请求的能力。