在如今的互联网大潮中,NoSQL可谓是家喻户晓,Redis做为NoSQL中及其重要的一员,使咱们走向架构道路的一条必经之路。做为运维工程师来讲,是必需要掌握的!redis
既然提到了Redis数据库是非关系型数据,而且须要掌握Redis数据库。那么关于关系型数据库与非关系型数据库的基本概念是必需要了解的。数据库
数据库按照其结构能够分为关系型数据库与其余数据库,而这些其余数据库,咱们统称为非关系型数据库。vim
关系型数据库是一个结构化的数据库,建立在关系模型基础上,通常面向记录。它借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型指二维表格模型,于是一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织,现实世界中,各类实体与实体之间的各类联系均可以用关系模型来表示。SQL(结构化查询语言)语句就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操做。缓存
主流的关系型数据库包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。服务器
NoSQL:意思是“不只仅是SQL”,是非关系型数据库的总称。主流的NoSQL数据库有Redis、MongDB、Hbase、CouhDB等。这些数据库,他们的存储方式,存储结构以及使用场景都是彻底不一样的。因此咱们认为它是一个非关系型数据库的集合,而不是像关系型数据库同样,是一个统称。简单来讲:主流的关系型数据库以外的数据库,均可以成为非关系型数据库。NoSQL数据库凭借着其非关系型、分布式、开源和横向扩展等优点,被认为是下一代数据库产品。网络
关系型数据库已经诞生好久了,并且咱们一直都在使用,没有发生有什么问题,面对这样的状况,为何还能产生非关系型数据库?架构
随着Web 2.0网站的兴起,关系型数据库在应对Web 2.0网站,特别是海量数据和高并发的SNS(社交网络服务)类型的Web 2.0网站时,暴露出不少难以解决的问题。主要的就是三高问题:并发
Web 2.0网站会根据用户的个性化信息来实时生成动态页面和提供动态信息。所以,没法使用动态页面静态化技术,因此数据库的并发负载很是高,通常会达到10000次/s以上的读写请求。关系型数据库对于上万次的查询请求仍是能够勉强支撑的。当出现上万次的写数据请求时,硬盘I/O就已经没法承受了。对于普通的BBS网站,每每也会存在高并发的写数据请求。好比:爆料明星等,就会有不少人评论。结果颇有可能由于流量过大而引发网站瘫痪。运维
相似于大型的社交网站,好比:Facebook、Friendfeed等。天天都会产生大型的用户动态信息。例如:Facebook一个月就会产生2.5亿条用户动态信息。对于关系型数据库来讲,在一个包含2.5亿条记录的表中执行SQL查询。效率是很是低的。tcp
在Web架构中,数据库是最难进行横向扩展的。当应用系统的用户量与访问量与日俱增时,数据库是没办法像Web服务器同样,简单得经过添加硬件和服务器节点来扩展其性能和负载能力的。尤为对于一些须要24小时对外提供服务器的网站来讲,数据库的升级与扩展每每会伴随着停机维护与数据迁移,其工做量是很是庞大的。
关系型数据库和非关系型数据库都有各自的特色与应用场景。二者的紧密结合将会给Web 2.0的数据库发展带来新的思路。让关系型数据库关注在关系上,非关系型数据库关注在存储上。
经过以上内容,大体能够了解到非关系的一些基本概念,接下来进一步的了解——Redis数据库。
Redis是一个开源的、使用C语言编写、支持网络、可基于内存亦可持久化的日志型、key-value(键值对)数据库,是目前分布式架构中不可或缺的一环。
Redis服务器程序是单进程模型,也就是在一台服务器上能够同时启动多个Redis进程,而Redis的实际处理速度则彻底依靠于主进程的的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力会有必定程度的降低,若在同一台服务器上开启多个Redis进程,Redis在提升并发处理能力的同时会给服务器的CPU形成很大压力。也就是说,在实际生产环境中,须要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPU资源比较紧张,采用单进程便可。
redis具备如下显著的优势:
- 具备极高的读写速度,数据读取的速度最高可达到110000次/s;数据写入速度最高可达到81000次/s;
- 支持丰富的数据类型,不只仅支持简单的key-value数据类型,还支持Strings、Lists、Hashes、Sets及Ordered Sets等数据类型操做;
- 支持数据的持久化,能够将内存中的数据保存在硬盘中,重启时能够再次加载使用;
- 原子性,Redis全部的操做都是原子性的;
- 支持数据备份,及master-salve模式的数据备份;
Redis数据库做为内存运行的数据库,缓存是其较常应用的场景之一,除此以外,Redis常见应用场景还包括获取N个数据的操做、排行榜应用、计数器应用、存储关系、实施分析系统、日志记录等。
Redis数据库的安装相对于其余服务来讲比较简单,能够经过官网下载相应的软件包,也可使用本人发布的网盘连接:https://pan.baidu.com/s/1bOhIr3yJmSVUpjTdv_x3Kw
提取码:zp79
上传到Linux服务器进行解压、安装便可!
一般状况下在Linux系统中进行源码编译安装,须要执行./configure进行环境检查与配置。从而生成Makefile文件,再执行make && make install命令进行编译安装,而Redis源码包直接提供了Makefile文件,因此在解压完软件包后,可直接进入解压后的软件包目录,执行make && make install命令进行编译安装便可!以下:
[root@localhost ~]# tar zxf 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
按照以上这样的方式安装,redis服务默认的安装位置是/usr/src/redis-3.2.9/src
在安装过程当中,若是想要安装到指定目录最好先进入相应的目录,再执行相应的操做便可!也可使用如下命令:
[root@localhost redis-3.2.9]# make && make PREFIX=/usr/local/ install //安装到/usr/local目录
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 ~]# netstat -anpt | grep redis tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6396/redis-server 1 //确认监听端口为6379
安装完成以后(服务器默认已经启动)可使用Redis的服务控制脚本对Redis服务进行控制,命令以下:
[root@localhost ~]# /etc/init.d/redis_6379 status Redis is running (6396) [root@localhost ~]# /etc/init.d/redis_6379 stop [root@localhost ~]# /etc/init.d/redis_6379 restart
Redis主配置文件为/etc/redis/6379.conf,配置文件默认就能够知足需求,固然也可根据实际状况对配置文件进行修改, 配置文件大体内容:
[root@localhost ~]# vim /etc/redis/6379.conf ……………… //省略部份内容 bind 127.0.0.1 192.168.1.1 //监听的主机地址(最好加上本身的IP地址) port 6379 //监听端口 daemonize yes //启动守护进程 pidfile /var/run/redis_6379.pid //指定PID文件 loglevel notice //日志级别 logfile /var/log/redis_6379.log //指定日志文件 //redis服务的配置文件几乎不须要修改任何内容就可直接工做! //修改完配置文件重启服务,这是常识,不要大意!!! [root@localhost ~]# /etc/init.d/redis_6379 restart
关于优化Redis服务能够参考的参数有:
Redis软件提供了多个命令工具,当Redis安装时,所包含的软件工具会同时被安装到系统中,在系统中能够直接使用。
Redis服务命令工具的做用:
- redis-server:用于启动Redis服务的工具;
- redis-benchmark:用于检测Redis在本机的运行效率;
- redis-check-aof:修复AOF持久化文件;
- redis-check-rdb:修复RDB持久化文件;
- redis-cli:Redis命令工具;
这篇博文主要介绍redis-cli、redis-benchmark命令工具的使用。
Redis数据库系统也是一个典型的C/S(客户端/服务器端)架构的应用,要访问Redis数据库须要使用专门的客户端软件。Redis服务的客户端软件就是自带的redis-cli命令行非法操做。使用redis-cli链接到指定数据库,链接成功后会进入提示符为“远程主机IP地址:端口号>”的数据库操做环境。用户就能够输入各类操做语句对数据库进行管理。好比:
[root@localhost ~]# redis-cli //链接到本机的Redis数据库 127.0.0.1:6379> ping //检测Redis服务是否为启动状态 PONG
在进行数据库链接操做时,客户端(前提是支持redis命令工具)能够经过选项来指定远程主机上的Redis数据库(Redis服务器配置文件中必须有真实的IP地址),实验环境,我就把Redis服务器的防火墙强行关闭了,实际环境中,确定是要开启相应端口。命令格式以下:
[root@localhost ~]# redis-cli -h 192.168.1.1 -p 6379 192.168.1.1:6379> info //登陆成功,使用“info”能够查看Redis服务器的详细信息 //“-h”指定远程主机、“-p”指定Redis服务的端口号、“-a”指定redis数据库的密码(若是没有密码便可省略)
在数据库操做环境中,使用help命令能够获取命令的相应帮助。
有三种获取命令帮助的方式:
- help @<group>:获取<group>中的命令列表
- help <command>:获取某个命令的帮助
- help <tab>:获取可能帮助的主题列表
具体操做方法以下:
[root@localhost ~]# redis-cli 127.0.0.1:6379> help @list //查看全部与list数据类型相关的命令 ………… //内容太多,这里就省略了 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服务器进行性能检测,命令格式以下:
[root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -c 100 -n 10000 ……………… //省略部份内容 ====== MSET (10 keys) ====== 10000 requests completed in 0.26 seconds 100 parallel clients 3 bytes payload keep alive: 1 16.44% <= 1 milliseconds 95.07% <= 2 milliseconds 96.67% <= 3 milliseconds 97.93% <= 4 milliseconds 99.24% <= 5 milliseconds 99.44% <= 6 milliseconds 99.67% <= 7 milliseconds 99.92% <= 8 milliseconds 100.00% <= 9 milliseconds 38759.69 requests per second //针对IP地址为192.168.1.一、端口号为6379的Redis服务器发送100个并发链接与10000个请求测试性能 [root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -q -d 100 //针对IP地址为192.168.1.一、端口号为6379的Redis服务器测试存取大小为100B的数据包的性能 [root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -t set,lpush -n 10000 -q SET: 37313.43 requests per second LPUSH: 45248.87 requests per second //针对IP地址为192.168.1.一、端口号为6379的Redis服务器在进行set与lpush操做时的性能 //实验环境,性能较差,多多谅解!
经过博文前面的介绍,已经知道Redis数据库采用key-value(键值对)的数据存储形式。
使用的命令大体是:
- set:存放数据,基本格式:set key value;
- get:获取数据,基本格式:get key;
好比:
127.0.0.1:6379> set k1 qq OK 127.0.0.1:6379> get k1 "qq"
使用keys命令能够获取符合规则的键值列表,一般能够结合“*”、“?”等选项使用。例如:
127.0.0.1:6379> keys * //查看当前数据库的全部键 1) "mylist" 2) "k2" 3) "k11" 4) "counter:__rand_int__" 5) "key:__rand_int__" 6) "k1" 7) "k3" //不光是本身设置的键,还有系统默认的键 127.0.0.1:6379> keys k* //查看当前数据库中以“k”开头的键 1) "k2" 2) "k11" 3) "key:__rand_int__" 4) "k1" 5) "k3" 127.0.0.1:6379> keys k? //查看当前数据库中以“k”开头后面包含任意一位的键 1) "k2" 2) "k1" 3) "k3" 127.0.0.1:6379> keys k?? //查看当前数据库中以“k”开头后面包含任意两位的键 1) "k11"
使用exists命令能够判断键值是否存在,例如:
127.0.0.1:6379> exists k1 (integer) 1 127.0.0.1:6379> exists k0 (integer) 0 //返回值1表示存在;0表示不存在
使用del命令能够删除当前数据库的指定key,例如:
127.0.0.1:6379> del k1 (integer) 1 127.0.0.1:6379> get k1 (nil) //删除以后,k1键对应的数据也就消失了
使用type命令能够获取key对应的value值类型,例如:
127.0.0.1:6379> type k2 string //字符串类型
rename命令是对已有key进行重命名,格式为:“rename 源key 目标key”。使用rename命令进行重命名操做时,不管目标key是否存在都进行重命名,并且源key的值会覆盖目标key的值。在实际使用过程当中,建议使用exists命令查看目标key是否存在,再决定是否执行rename命令,避免覆盖重要数据。例如:
127.0.0.1:6379> get k2 "1qq" 127.0.0.1:6379> get k3 "1q" 127.0.0.1:6379> rename k2 k3 OK 127.0.0.1:6379> get k3 "1qq"
renamenx命令语法格式、做用与rename命令相同,不一样点在于使用renamex命令进行重命名是,若是目标key存在则不进行重命名。例如:
127.0.0.1:6379> keys k?? 1) "k11" 127.0.0.1:6379> renamenx k3 k11 (integer) 0 //返回值是0,表示失败
dbsize命令的做用是查看当前数据库中key的数目,例如:
127.0.0.1:6379> dbsize (integer) 5
Redis支持多数据库,默认有16个数据库,数据库名称是用数字0-15来表示的。切换数据库的操做,以下:
127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> select 0 OK 127.0.0.1:6379> //使用select命令进行切换,端口号后面什么都没有,则表示0号数据库
Redis的多数据库在必定程度上是相对独立的。例如:
127.0.0.1:6379> set q1 1 OK 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> get q1 (nil)
Redis数据库提供了一个“move”命令,能够进行多数据库的数据移动。例如:
127.0.0.1:6379> move q1 1 (integer) 1 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> get q1 "1" //将0号数据库中“q1”的数据移动到1号数据库
Redis数据库的整库数据删除主要分为两个部分:
可是,数据清空操做比较危险,生产环境下,通常不建议使用。
———————— 本文至此结束,感谢阅读 ————————