目录
关系数据库与非关系型数据库
★★Redis简介
★★Redis安装部署
★★Redis配置参数
★★Redis命令工具
redis-cli命令行工具
redis-benchmark测试工具
★★Redis常用命令
key相关命令
多数据库常用命令
★★Redis群集
Redis群集部署
1. 安装Redis并修改配置文件
2. 使用脚本创建群集
3. 查看群集状态
4. 测试群集
关系型数据库
一个结构化的数据库,创建在关系模型基础上,一般面向于记录
包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等
非关系型数据库
除了主流的关系型数据库以外的数据库,都认为是非关系型的
包括Redis、MongBD、Hbase、CouhDB等
非关系型数据库产生背景
High performance——对数据库高并发读写需求
Huge Storage——对海量数据高效存储与访问需求
High Scalability && High Availability——对数据库高可扩展性与高可用性需求
Redis是一个开源的、使用C语言编写、支持网络、可基于内存亦可支持持久化的日志型、key-value(键值对)数据库,是目前分布式结构中不可或缺的一环。
Redis的优点
具有极高的数据读写速度,读取数据的速度最高可达到110000次/s,数据写入速度最高可达到81000次/s。
支持丰富的数据类型,不仅仅支持简单的key-value数据类型,还支持Strings、Lists、Hashes、Sets及Ordered Sets等数据类型操作。
支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
原子性,Redis所有操作都是原子性的。
支持数据备份,即master-salve模式的数据备份。
Redis官网Redis
[root@localhost ~]# mount /dev/cdrom /media
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]# tar zxf /media/redis-3.2.9.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/redis-3.2.9/
[root@localhost redis-3.2.9]# make && make install
安装过程中,若要更改默认的安装路径,可以使用以下命令安装操作。
make PREFIX=安装路径 install
make install 只是安装了二进制文件到系统中,并没有启动脚本和配置文件。通过使用install_server.sh脚本文件可以设置Redis服务所需要的相关配置文件。当脚本运行完毕,Redis服务就已经启动成功,默认侦听端口为6379。(执行后确认消息按回车下一步)
[root@localhost redis-3.2.9]# cd /usr/src/redis-3.2.9/utils/
[root@localhost 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/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/bin/redis-server //执行命令
Cli Executable : /usr/local/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@localhost utils]# netstat -anpt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 7504redis-server 1
安装完成后,可通过Redis的服务控制脚本/etc/init.d/redis_6379来对Redis服务进行控制。
[root@localhost ~]# /etc/init.d/redis_6379 stop //关闭服务
Stopping ...
Redis stopped
[root@localhost ~]# /etc/init.d/redis_6379 start //启动服务
Starting Redis server...
[root@localhost ~]# /etc/init.d/redis_6379 restart //重启服务
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@localhost ~]# /etc/init.d/redis_6379 status //查看运行状态
Redis is running (7581)
Redis主配置文件为/etc/redis/6379.conf,由注释行与设置行两部分组成。
[root@localhost ~]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.1.10 //监听的主机地址(配置时添加本机地址可以远程访问)
port 6379 //端口
daemonize yes //启用守护进程
pidfile /var/run/redis_6379.pid //指定PID文件
loglevel notice //日志级别
logfile /var/log/redis_6379.log //指定日志文件
[root@localhost ~]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
Redis软件提供了多个命令工具,当Redis安装时,所包含的软件工具会同时被安装到系统中,在系统中可以直接使用。这些命令工具的作用如下所示。
redis-server:用于启动Redis的工具。
redis-benchmark:用于检测Redis在本机的运行效率。
redis-check-aof:修复AOF持久化文件。
redis-check-rdb:修复RDB持久化文件。
redis-cli:Redis命令行工具。
redis-setinel:redis-server文件的软连链接。
Redis数据库系统也是一个典型的C/S架构的应用,要访问Redis数据库需要使用专门的客户端软件(redis-cli)。
[root@localhost ~]# redis-cli //连接本机的Redis数据库
127.0.0.1:6379> ping //检测Redis服务是否启动
PONG
127.0.0.1:6379>
在进行数据库连接操作时,可以通过选项来指定远程主机上的Redis数据库,-h指定远程主机、-p指定Redis服务的端口号,-a指定密码,执行exit或quit命令退出原来的Shell环境。
[root@localhost ~]# redis-cli -h 192.168.1.10 -p 6379
192.168.1.10:6379> info
# Server
redis_version:3.2.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:44ee4c7b13835271
......//省略部分内容
192.168.1.10:6379> exit
[root@localhost ~]#
在数据库操作环境中,使用help命令可以获取命令类型的帮助。
具体操作如下:
[root@localhost ~]# redis-cli
127.0.0.1:6379> help @list //查看所有与list数据类型相关的命令
BLPOP key [key ...] timeout
summary: Remove and get the first element in a list, or block until one is available
since: 2.0.0
BRPOP key [key ...] timeout
summary: Remove and get the last element in a list, or block until one is available
since: 2.0.0
......//省略部分内容
127.0.0.1:6379> help set //查看set命令的命令帮助
SET key value [EX seconds] [PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string
redis-benchmark是官方自带的redis性能测试工具,可以有效地测试redis服务的性能。基本的测试语法为redis-benchmark [选项] [选项参数]。
-h:指定服务器主机名
-p:指定服务器端口
-s:指定服务器socket
-c:指定并发连接数
-n:指定请求数
-d:以字节(B)的形式指定SET/GET值的数据大小
-k:1=keep alive 0=reconnect
-r:SET/GET/INCR使用随机key,SADD使用随机值
-P(大写):通过管道传输请求
-q:强制退出redis,仅显示query/sec值
--csv:以CSV格式输出
-l:生成循环,永久执行测试
-t:仅运行以逗号分隔的测试命令列表
[root@localhost ~]# redis-benchmark -h 192.168.1.10 -p 6379 -c 100 -n 10000
......//省略部分内容
9775.17 requests per second
====== MSET (10 keys) ======
10000 requests completed in 0.14 seconds
100 parallel clients
3 bytes payload
keep alive: 1
87.86% <= 1 milliseconds
98.75% <= 2 milliseconds
100.00% <= 3 milliseconds
74074.07 requests per second
[root@localhost ~]# redis-benchmark -h 192.168.1.10 -p 6379 -q -d 100
PING_INLINE: 82850.04 requests per second
PING_BULK: 79744.82 requests per second
SET: 78616.35 requests per second
GET: 78492.93 requests per second
INCR: 80840.74 requests per second
LPUSH: 78003.12 requests per second
RPUSH: 77881.62 requests per second
LPOP: 80000.00 requests per second
RPOP: 79365.08 requests per second
SADD: 79554.50 requests per second
SPOP: 78864.35 requests per second
LPUSH (needed to benchmark LRANGE): 79681.27 requests per second
LRANGE_100 (first 100 elements): 36062.03 requests per second
LRANGE_300 (first 300 elements): 12918.23 requests per second
LRANGE_500 (first 450 elements): 7885.19 requests per second
LRANGE_600 (first 600 elements): 5531.89 requests per second
MSET (10 keys): 77399.38 requests per second
执行下面命令测试本机上redis服务在进行set与lpush操作时的性能。
[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
SET: 85470.09 requests per second
LPUSH: 90826.52 requests per second
set:存放数据,基本的命令格式为[set 键 值]
get:获取数据,基本的命令格式为[get 键]
例如,在当前数据库下存放一个key为666,value为777的数据,执行get 666 命令即可查看刚才存放的数据。
[root@localhost ~]# redis-cli
127.0.0.1:6379> set 666 777
OK
127.0.0.1:6379> get 666
"777"
获取符合规则的键值列表
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) "teacher"
2) "k1"
3) "k2"
4) "v1"
5) "v5"
6) "k3"
127.0.0.1:6379> set v22 5
OK
127.0.0.1:6379> keys v* //查看当前数据库中以v开头的数据
1) "v22"
2) "v1"
3) "v5"
127.0.0.1:6379> keys v? //查看对当前数据库中以v开头后面包含任意一位的数据
1) "v1"
2) "v5"
127.0.0.1:6379> keys v?? //查看对当前数据库中以v开头后面包含任意两位的数据
1) "v22"
使用exists命令可以判断键值是否存在
127.0.0.1:6379> exists teacher //判断teacher键是否存在
(integer) 1 //”1“表示teacher键存在
127.0.0.1:6379> exists tea
(integer) 0 //表示tea键不存在
使用del命令可以删除当前数据库的指定key
127.0.0.1:6379> keys * //查看所有键
1) "teacher"
2) "v22"
3) "k1"
4) "k2"
5) "v1"
6) "v5"
7) "k3"
127.0.0.1:6379> del v5 //删除数据v5
(integer) 1
127.0.0.1:6379> get v5
(nil)
获取key对应的value值类型
127.0.0.1:6379> type k1
string
对已有的key进行重命名,命令格式为rename 源key 目标key。无论目标key是否存在都会进行重命名,且源key的值会覆盖目标key的值。在实际使用过程中,建议先用exists命令查看key是否存在,再执行命令避免覆盖重要数据。
127.0.0.1:6379> keys v*
1) "v22"
2) "v1"
127.0.0.1:6379> rename v22 v2
OK
127.0.0.1:6379> keys v*
1) "v2"
2) "v1"
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"
对已有可以进行重命名,并检测新名是否存在,重命名时,如果目标key存在则不进行重命名。
127.0.0.1:6379> keys *
1) "v2"
2) "teacher"
3) "k1"
4) "k2"
5) "k3"
127.0.0.1:6379> get teacher
"zhou"
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) "v2"
2) "teacher"
3) "k1"
4) "k2"
5) "k3"
127.0.0.1:6379> get teacher
"zhou"
127.0.0.1:6379> get v2
"4"
查看当前数据库中的key的数目
127.0.0.1:6379> dbsize
(integer) 5
Redis支持多数据库,Redis在没有任何改动的情况下默认包含16个数据库,数据库名称是用数字0~15来依次命名的。默认使用的序号为“0”的数据库(注意看端口号后的中括号)。
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
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 键 库序号“ 。
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)
Redis数据库的整库数据删除主要分为两个部分:清空当前数据库的数据,使用FLUSHDB命令实现;清空所有数据库的数据,使用FLUSHALL命令实现。但是,数据清空比较危险,生产环境下不建议使用。
Redis Cluster采用虚拟槽分区,将所有的数据根据算法映射到0~16384整数槽内 Redis Cluster是一个无中心的结构 每个节点都保存数据和整个集群的状态
Master:Master之间分配slots Slave:Slave向它指定的Master同步数据
6379端口用于客户端的连接 16379端口用于群集总线
如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态 如果集群中超过半数以上master挂掉,无论是否有slave,集群都进入fail状态
使用六台服务器搭建Redis群集,其中三台为MASTER,三台为SLAVE。六台服务器地址为:192.168.1.10/24~192.168.1.60/24,步骤如下。
六台服务器上都安装Redis,安装前面的步骤安装即可,只有IP地址不同,其他配置都一样,然后修改配置文件。
[root@localhost ~]# vim /etc/redis/6379.conf
port 6379
bind 192.168.1.10 //本机地址
daemonize yes
logfile /var/log/redis_6379.log
........................下方配置取消注释”#“
cluster-enabled yes //启动群集
cluster-config-file nodes-6379.conf //群集配置文件
cluster-node-timeout 15000
cluster-require-full-coverage no //yes改为no
实验环境中,六台服务器每台都需要配置,只需要单独修改一下IP地址即可,所以可以用scp命令来复制文件。
[root@localhost ~]# scp [email protected]:/etc/redis/6379.conf /etc/redis/
修改六台服务器后,在每台上重启redis服务,并查看6379和16379端口是否已经正常开启。
[root@localhost ~]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost ~]# netstat -anpt | grep 6379
tcp 0 0 192.168.1.60:6379 0.0.0.0:* LISTEN 9659/redis-server 1
tcp 0 0 192.168.1.60:16379 0.0.0.0:* LISTEN 9659/redis-server 1
tcp 0 0 127.0.0.1:6379 127.0.0.1:34070 TIME_WAIT
创建群集要用到ruby的一个脚本,在创建群集前,需要先安装ruby的运行环境和ruby的Redis客户端。gem命令是提前下载的redis-3.2.0.gem软件包直接上传即可使用。
注意:该操作在其中一台服务器上操作即可。
[root@localhost ~]# yum -y install ruby rubygems //系统盘
[root@localhost ~]# eject
[root@localhost ~]# mount /dev/cdrom /media //挂载redis-3.2.0.gem软件包
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# cd /media
[root@localhost media]# gem install redis --version 3.2.0
Successfully installed redis-3.2.0
Parsing documentation for redis-3.2.0
Installing ri documentation for redis-3.2.0
1 gem installed
使用脚本文件创建群集
[root@localhost redis-3.2.9]# cd /usr/src/redis-3.2.9/src/
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.1.10:6379 192.168.1.20:6379 192.168.1.30:6379 192.168.1.40:6379 192.168.1.50:6379 192.168.1.60:6379
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.10:6379
192.168.1.20:6379
192.168.1.30:6379
Adding replica 192.168.1.40:6379 to 192.168.1.10:6379
Adding replica 192.168.1.50:6379 to 192.168.1.20:6379
Adding replica 192.168.1.60:6379 to 192.168.1.30:6379
M: 72e6931ff577f22800bb8e3f0d35e092f6c23c27 192.168.1.10:6379
slots:0-5460 (5461 slots) master
M: 8f539176e1ff7d4597b6e40e60e469c2ffe992b3 192.168.1.20:6379
slots:5461-10922 (5462 slots) master
M: 99914bbfc283c482407025ec929f4928650b5f4a 192.168.1.30:6379
slots:10923-16383 (5461 slots) master
S: 8df39adffccf37618650eec0661f0606676f0f14 192.168.1.40:6379
replicates 72e6931ff577f22800bb8e3f0d35e092f6c23c27
S: a81e45bef554a8802d2aa7fa278d7ad1961450ba 192.168.1.50:6379
replicates 8f539176e1ff7d4597b6e40e60e469c2ffe992b3
S: e34893118da9241290146d44a388080e0b5d0b2e 192.168.1.60:6379
replicates 99914bbfc283c482407025ec929f4928650b5f4a
Can I set the above configuration? (type 'yes' to accept):yes //输入yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.
>>> Performing Cluster Check (using node 192.168.1.10:6379)
M: 72e6931ff577f22800bb8e3f0d35e092f6c23c27 192.168.1.10:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 8f539176e1ff7d4597b6e40e60e469c2ffe992b3 192.168.1.20:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: a81e45bef554a8802d2aa7fa278d7ad1961450ba 192.168.1.50:6379
slots: (0 slots) slave
replicates 8f539176e1ff7d4597b6e40e60e469c2ffe992b3
M: 99914bbfc283c482407025ec929f4928650b5f4a 192.168.1.30:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: e34893118da9241290146d44a388080e0b5d0b2e 192.168.1.60:6379
slots: (0 slots) slave
replicates 99914bbfc283c482407025ec929f4928650b5f4a
S: 8df39adffccf37618650eec0661f0606676f0f14 192.168.1.40:6379
slots: (0 slots) slave
replicates 72e6931ff577f22800bb8e3f0d35e092f6c23c27
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. //创建完成
M:主,S:从;从ID号可以看到三主三从服务器,1.10服务器的从为1.40,1.20的从服务器为1.50,1.30的从服务器为1.60。
[root@localhost src]# ./redis-trib.rb check 192.168.1.10:6379
>>> Performing Cluster Check (using node 192.168.1.10:6379)
M: 72e6931ff577f22800bb8e3f0d35e092f6c23c27 192.168.1.10:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 8f539176e1ff7d4597b6e40e60e469c2ffe992b3 192.168.1.20:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: a81e45bef554a8802d2aa7fa278d7ad1961450ba 192.168.1.50:6379
slots: (0 slots) slave
replicates 8f539176e1ff7d4597b6e40e60e469c2ffe992b3
M: 99914bbfc283c482407025ec929f4928650b5f4a 192.168.1.30:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: e34893118da9241290146d44a388080e0b5d0b2e 192.168.1.60:6379
slots: (0 slots) slave
replicates 99914bbfc283c482407025ec929f4928650b5f4a
S: 8df39adffccf37618650eec0661f0606676f0f14 192.168.1.40:6379
slots: (0 slots) slave
replicates 72e6931ff577f22800bb8e3f0d35e092f6c23c27
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
登录Redis群集,设置键值测试。需要跟“-c”参数来激活群集模式。
[root@localhost ~]# redis-cli -h 192.168.1.20 -p 6379 -c
192.168.1.20:6379> set centos 7
-> Redirected to slot [467] located at 192.168.1.10:6379
OK
192.168.1.10:6379> get centos
"7"
创建好群集以后,可以看到,当创建键值时,重定向到其他的服务器上,是按照slot分配的。