目录
关系型数据库
一个结构化的数据库,创建在关系模型基础上,一般面向于记录
包括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 root@192.168.1.10:/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分配的。