Redis安装部署
资源列表
操作系统 | 配置 | 主机名 | IP | 所需软件 |
---|---|---|---|---|
CentOS 7.9 | 2C4G | redis-node1 | 192.168.93.101 | redis-4.0.9.tar.gz |
CentOS 7.9 | 2C4G | redis-node2 | 192.168.93.102 | redis-4.0.9.tar.gz |
基础环境
- 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
- 关闭内核安全机制
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
- 修改主机名
hostnamectl set-hostname redis-node1
hostnamectl set-hostname redis-node2
一、Redis安装部署
-
两台主机都需要安装,以node1节点为例进行演示
-
Redis源码包中直接提供了Makefile文件,所以解压完软件包后,直接进入源码包目录,执行make与make install命令进行安装
[root@redis-node1 ~]# yum -y install gcc gcc-c++ make
[root@redis-node1 ~]# tar -zxvf redis-6.2.4.tar.gz
[root@redis-node1 ~]# cd redis-6.2.4/
# PREFIX=/usr/local/redis:指定安装目录
[root@redis-node1 redis-6.2.4]# make && make PREFIX=/usr/local/redis install
[root@redis-node1 redis-6.2.4]# ln -s /usr/local/redis/bin/* /usr/local/bin/
- make install只是安装了二进制文件到系统中,并没有启动脚本 和配置文件。软件包中默认提供另一个install_server.sh脚本文件,通过该脚本文件可以设置Redis服务所需要的相关配置文件。当脚本运行完毕,Redis服务就已经启动,默认侦听端口为6379
[root@redis-node1 redis-6.2.4]# cd /root/redis-6.2.4/utils/
[root@redis-node1 utils]# vim install_server.sh
# 默认76行,注释掉一下内容,不然执行脚本的时候会报错
#_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
[root@redis-node1 utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] # 回车
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] # 回车
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] # 回车
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] # 回车
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server # 手动输入绝对路径
Selected config:
Port : 6379 # 端口号
Config file : /etc/redis/6379.conf # 配置文件路径
Log file : /var/log/redis_6379.log # 日志文件路径
Data dir : /var/lib/redis/6379 # 数据文件路径
Executable : /usr/local/redis/bin/redis-server # 可执行文件路径
Cli Executable : /usr/local/redis/bin/redis-cli # 客户端命令行工具
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@redis-node1 utils]# netstat -anpt | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5875/redis-server 1
tcp6 0 0 ::1:6379 :::* LISTEN 5875/redis-server 1
二、添加为系统服务
[root@redis-node1 ~]# vim /etc/systemd/system/redis.service
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf
[Install]
WantedBy=multi-user.target
[root@redis-node1 ~]# kill 5875 # 先杀死redis控制脚本的启动服务
[root@redis-node1 ~]# systemctl daemon-reload
[root@redis-node1 ~]# systemctl start redis
[root@redis-node1 ~]# systemctl enable redis
[root@redis-node1 ~]# netstat -anpt | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5965/redis-server 1
tcp6 0 0 ::1:6379 :::* LISTEN 5965/redis-server 1
# 也可以使用redis脚本执行后自动生成的控制脚本来控制redis服务
[root@redis-node1 ~]# /etc/init.d/redis_6379 start
[root@redis-node1 ~]# /etc/init.d/redis_6379 stop
[root@redis-node1 ~]# /etc/init.d/redis_6379 restart
[root@redis-node1 ~]# /etc/init.d/redis_6379 status
三、配置参数
- Redis主配置文件为/etc/redis/6379.conf,有注释行与设置行两部分组成。与大多数Linux配置文件一样,注释性的文字以“#”开始,包含了对相关配置内容进行的说明和解释。除了注释行与空行以外的内容即为设置行。可根据生产环境的需求调整相关参数,如下:
[root@redis-node1 ~]# vim /etc/redis/6379.conf
# 若注释bind,Redis将侦听服务器上所有可用网络接口的连接
bind 127.0.0.1 192.168.93.101 # 本地回环接口,若不修改,外网无法连接服务端
port 6379 # 默认端口
daemonize yes # 启用守护进程,后台运行
pidfile /var/run/redis_6379.pid # 指定PID文件
loglevel notice # 日志级别
logfile /var/log/redis_6379.log # 指定日志文件
[root@redis-node1 ~]# systemctl restart redis
[root@redis-node1 ~]# netstat -anpt | grep 6379
tcp 0 0 192.168.93.101:6379 0.0.0.0:* LISTEN 6029/redis-server 1
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6029/redis-server 1
- 除了上述配置参数外,Redis主配置文件中还包含很多其他的配置参数,具体内容如下表
参数 | 作用 |
---|---|
timeout 300 | 当客户端闲置很长时间后关闭连接,如果指定为0,表示关闭该功能 |
dbfilename dump.rdb | 指定本地数据库文件名,默认值为dump.rdb |
dir /var/lib/redis/6379 | 指定本地数据库存放目录 |
maxclients 10000 | 设置同一时间最大客户端连接数,默认为10000.Redis可以同时开发的客户端连接数为Redis进程可以开打的最大文件描述符数,如果设置maxclients 0,表示不限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息 |
rdbcompression yes | 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU资源,可以关闭该选项,但会导致数据库文件变得巨大 |
slaveof | 当本地为从服务器时,设置主服务的IP地址及端口。在Redis启动时,从服务器会自动从主服务进行数据同步 |
masterauth | 当主服务设置了密码保护时,从服务连接主服务器的密码 |
requirepass foobared | 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭 |
maxmemory | 指定Redis最大内存限制。Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会尝试清除已经到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新VM机制,会把Key存放内存,Value会存放在Swap分区 |
appendonly no | 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步把数据写入磁盘,如果不开启,可能会断电时导致一段时间内的数据丢失。因为Redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在内存中。默认为no |
appendfilename appendonly.aof | 指定更新日志文件名,默认为appendfilename.aof |
appendfsync everysec | 指定更新条件,共有3个可选值: no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折中,默认值) |
activerehashing yes | 指定知否激活重置哈希,默认为开启 |
include /path/to/local.conf | 指定包含其他的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有的特定配置文件 |
四、Redis命令工具
- Redis软件提供了多个命令工具。安装Redis服务时,所包含的软件工具会同时被安装到系统中,在系统中可以直接使用。这些命令工具的作用分别如下所示。
redis-server:用户启动Redis的工具
redis-benchmark:用于检测Redis在本机的运行效率
redis-check-aof:修复AOF持久化文件
reids-check-rdb:修改RDB持久化文件
redisc-cli:Redis命令行工具
# 本章只介绍redis-cli、redis-benchmark命令工具的使用
4.1、redis-cli命令行工具
- Redis数据库系统也是一个典型的C/S(客户端/服务器端)架构的应用,要访问Redis数据库需要使用专门的客户端软件
# 连接本地Redis数据库
[root@redis-node1 ~]# redis-cli # 连接本地Redis数据库
127.0.0.1:6379> ping # 检测Redis服务是否启动
PONG
127.0.0.1:6379>
# 连接远程主机Redis数据库
命令语法:redis-cli -h host -p port -a password
-h:指定主机
-p:指定端口
-a:指定密码,如果无密码可以省略该选项
[root@redis-node2 ~]# redis-cli -h 192.168.93.101 -p 6379
192.168.93.101:6379> info
# Server
redis_version:6.2.4
redis_git_sha1:00000000
redis_git_dirty:0
# exit或quit可以退回到原来的Shell环境
192.168.93.101:6379> exit
[root@redis-node2 ~]#
- 在数据库操作环境中,使用htlp命令可以获取命令类型的帮助。有三种获取命令的帮助的方式
help @<group>:获取<group>中的命令列表;
help <command>:获取某个命令的帮助;
help <tab>:获取可能帮助的主题列表;
[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> help @list # 查看所有与List数据类型的相关命令
BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout
summary: Pop an element from a list, push it to another list and return it; or block until one is available
since: 6.2.0
127.0.0.1:6379> help set # 查看set命令的帮助
SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
summary: Set the string value of a key
since: 1.0.0
group: string
4.2、redis-benchmark测试工具
- redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。基本的测试语言为redis-benchmark [option] [option value]
# 常用选项如下所示
-h:指定服务器的主机名
-p:指定服务器端口
-s:指定服务器socket
-c:指定并发连接数
-n:指定请求数
-d:以字节的形式指定SET/GET指的数据大小
-k:1=keep alive 0=reconnect
-r:SET/GET/INCR 使用随机 key,SADD 使用随机值
-P:通过管道传输<numreq>请求
-q:强制退出redis。仅显示query/sec值
--csv:以CSV格式输出
-l:生成循环,永久执行测试
-t:仅运行以逗号分隔的测试命令列表
-l:ldle模式。仅打开N个idle连接并等待
- 结合上述选项,可以针对某台Redis服务器进行性能检测,如指定redis-benchmark -h 192.168.93.101 -p 6379 -c 100 -n 100000 命令即可向IP地址为192.168.93.101、端口为6379的Redis服务器发送100个并发连接与100000个请求测试性能
[root@redis-node2 ~]# redis-benchmark -h 192.168.93.101 -p 6379 -c 100 -n 100000
Summary:
throughput summary: 54945.05 requests per second
latency summary (msec):
avg min p50 p95 p99 max
1.602 0.216 1.591 2.143 2.287 6.871
- 指定redis-benchmark -h 192.168.93.101 -p 6379 -q -d 100命令的作用是测试存取大小为100字节的数据包的性能
[root@redis-node2 ~]# redis-benchmark -h 192.168.93.101 -p 6379 -q -d 100
LRANGE_600 (first 600 elements): 6668.00 requests per second, p50=2.951 msec
MSET (10 keys): 54200.54 requests per second, p50=0.799 msec
- 还可以测试某些操作的的性能,例如指定redis-benchmark -t set,lpush -n 100000 -q命令的作用是测试本机上Redis服务在进行set与plush操作时的性能
[root@redis-node2 ~]# redis-benchmark -h 192.168.93.101 -p 6379 -t set,lpush -n 100000 -q
SET: 62972.29 requests per second, p50=0.455 msec
LPUSH: 61614.29 requests per second, p50=0.503 msec
五、Redis数据库常用命令
# 前面提到Redis数据库采用key-value(键值对)的数据存储形式,所使用的命令是set与get命令
set:存放数据,基本的命令格式为set key value
get:获取数据,基本的命令格式为get key
# 例如创建名为teacher的键值为zhanglong,使用get获取teacher键的值
127.0.0.1:6379> set teacher zhanglong
OK
127.0.0.1:6379> get teacher
"zhanglong"
5.1、key相关命令
5.1.1、keys
- 使用keys命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> set k2 2
OK
127.0.0.1:6379> set k3 3
OK
127.0.0.1:6379> set v1 4
OK
127.0.0.1:6379> set v5 5
OK
127.0.0.1:6379> keys * # 查看当前数据库中所有键
1) "v1"
2) "k3"
3) "mylist"
4) "counter:__rand_int__"
5) "teacher"
6) "k2"
7) "myhash"
8) "v5"
9) "k1"
10) "key:__rand_int__"
127.0.0.1:6379> set v22 5 # 查看当前数据库中以v开头的键名
OK
127.0.0.1:6379> keys v*
1) "v1"
2) "v22"
3) "v5"
127.0.0.1:6379> keys v? # 查看当前数据库中以v开头后面包含任意一位的键名
1) "v1"
2) "v5"
127.0.0.1:6379> keys v?? # 查看当前数据库中以v开头v开头后面包含任意两位的键名
1) "v22"
5.1.2、exists
- exists命令可以判断键值是否存放
127.0.0.1:6379> exists teacher # 判断teacher键是否存放
(integer) 1 # ”1“表示键存在
127.0.0.1:6379> exists tea
(integer) 0 # ”0“表示键不存在
5.1.3、del
- del命令可以删除当前数据库的指定key
127.0.0.1:6379> keys *
1) "v1"
2) "k3"
3) "mylist"
4) "counter:__rand_int__"
5) "teacher"
6) "v22"
7) "k2"
8) "myhash"
9) "v5"
10) "k1"
11) "key:__rand_int__"
127.0.0.1:6379> del v5
(integer) 1
127.0.0.1:6379> get v5
(nil)
5.1.4、type
- 使用type命令可以获取key对应的value值类型
127.0.0.1:6379> type k1
string
5.1.5、rename
- rename命令是对已有key进行重命名,其命令格式为:rename 源key 目标key。使用rename命令进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值。在实际使用过程中,建议先用exists命令查看目标key是否存在,然后再决定是否指定renane命令,以避免覆盖重要数据。(源key会消失)
127.0.0.1:6379> keys *
1) "v1"
2) "k3"
3) "mylist"
4) "counter:__rand_int__"
5) "teacher"
6) "v22"
7) "k2"
8) "myhash"
9) "k1"
10) "key:__rand_int__"
127.0.0.1:6379> rename v22 v2
OK
127.0.0.1:6379> keys v*
1) "v1"
2) "v2"
127.0.0.1:6379> get v1
"4"
127.0.0.1:6379> get v2
"5"
127.0.0.1:6379> rename v1 v2
OK
127.0.0.1:6379> get v1
(nil)
127.0.0.1:6379> get v2
"4"
5.1.6、renamenx
- renamenx命令的作用是对已有key进行重命名,并检测新名是否存在,其命令格式与renamenx的命令格式关键字不同外基本相同:renamenx 源key 目标key。使用renamenx命令进行重命名时,如果目标key存在则不进行重命名。(源和目标key都存在),若目标key不存在,则进行重命名,源key会丢失
127.0.0.1:6379> keys *
1) "k3"
2) "mylist"
3) "counter:__rand_int__"
4) "teacher"
5) "k2"
6) "myhash"
7) "v2"
8) "k1"
9) "key:__rand_int__"
127.0.0.1:6379> get teacher
"zhanglong"
127.0.0.1:6379> get v2
"4"
127.0.0.1:6379> renamenx v2 teacher
(integer) 0
127.0.0.1:6379> keys *
1) "k3"
2) "mylist"
3) "counter:__rand_int__"
4) "teacher"
5) "k2"
6) "myhash"
7) "v2"
8) "k1"
9) "key:__rand_int__"
127.0.0.1:6379> get teacher
"zhanglong"
127.0.0.1:6379> get v2
"4"
5.1.7、dbsize
- dbsize命令的作用是查看当前数据库中key的数目
127.0.0.1:6379> dbsize
(integer) 9
六、多数据库常用命令
- Redis支持多数据库,Redis在没有任何改动的情况下默认包含16个数据库,数据库名称是用数字0-15来依次命名的。使用select命令可以进行Redis的多数据库之间的切换,命令格式为select index,其中index表示数据库的序号。而使用redis-cli连接Redis数据库后,默认使用的是序号为0的数据库
6.1、多数据库间切换
127.0.0.1:6379> select 10 # 切换至序号为10的数据库
OK
127.0.0.1:6379[10]> select 15 # 切换到序号为15的数据库
OK
127.0.0.1:6379[15]> select 0 # 切换到序号为0的数据库
OK
6.2、多数据库间移动数据
- Redis的多数据库在一定程度上是相对独立的,例如在数据库0上面存放k1的数据,在其他1-15的数据库上无法查看到
127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get k1
(nil)
- Redis数据库提供了一个move的命令,可以进行多数据库之间的数据移动。命令的基本语法为”move key dbindex“。其中”key”表示当前数据库的目标键,“dbindex”表示目标数据库的序号,具体操作方式如下所示
127.0.0.1:6379[1]> select 0 # 切换至数据库0
OK
127.0.0.1:6379> get k1 # 查看目标数据是否存在
"100"
127.0.0.1:6379> move k1 1 # 将数据库0中k1移动到数据库1中
(integer) 1
127.0.0.1:6379> select 1 # 切换至目标数据库1
OK
127.0.0.1:6379[1]> get k1 # 查看被移动数据
"100"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get k1 # 在数据库0中无法查看到k1的值
(nil)
6.2、清除数据库内数据
# 清空当前数据库
127.0.0.1:6379> flushdb
OK
# 清空所有数据库的数据(不建议使用)
127.0.0.1:6379> flushall
OK
七、Redis持久化
- Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富,有字符串、列表、集合和有序集合。支持在服务器端计算集合等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构化服务器。
- Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化”);也可以把每一次数据变化都写入到一个文件里面(这称为“全持久化模式”)
- 由于Redis的数据都存放在内容中,如果没有配置持久化,Redis重启后数据就hi丢失了。所以,需要开启Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。Redis提供两种方式进行持久化,一种是RDB持久化(原理是将Redis在内存中的数据库记录定时dump到磁盘上的持久化),另一种是AOF持久化(append only file)(原理是将Redis的操作日志以追加的方式写入文件)
7.1、RDB和AOF的区别
- RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入到磁盘,实际操作过程种fork一个子进程,先将数据集写入临时文件,写入成功后,新的RDB文件特换之前的就RDB文件,并删除旧文件,用二进制压缩存储
- AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以开发文件看到详细的操作记录
7.2、Redis持久化配置
7.2.1、RDB持久化配置
- Redis会将数据集的快照dump到dump.rdb文件中
[root@redis-node1 ~]# vim /etc/redis/6379.conf
# 开发配置文件搜索save进行修改
save 900 1 # 在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照
save 300 10 # 在300秒(5分钟)之后,如果至少有3个key发生变化,则dump内存快照
save 60 10000 # 在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照
7.2.2、AOF持久化配置
- 在Redis的配置文件种存在三种同步方式
appendfsync always:每次有数据修改发生时都会写入到AOF文件
appendfsync everysec:每秒同步一次,该策略为AOF的缺省策略(推荐)
appendfsync no:从不同步(交给操作系统同步),高效但是数据不会被持久化
[root@redis-node1 ~]# vim /etc/redis/6379.conf
appendonly yes # 开启aof
# The name of the append only file (default: "appendonly.aof")
appendfilename "wzh.aof" # aof文件名称
appendfsync everysec # 同步方式(缺省策略)
[root@redis-node1 ~]# systemctl restart redis.service
[root@redis-node1 ~]# ls /var/lib/redis/6379/
dump.rdb wzh.aof