在现在的互联网大潮中,NoSQL可谓是家喻户晓,Redis作为NoSQL中及其重要的一员,使我们走向架构道路的一条必经之路。作为运维工程师来说,是必须要掌握的!
既然提到了Redis数据库是非关系型数据,并且需要掌握Redis数据库。那么关于关系型数据库与非关系型数据库的基本概念是必须要了解的。
一、关系型数据库与非关系型数据库的基本概念:
数据库按照其结构可以分为关系型数据库与其他数据库,而这些其他数据库,我们统称为非关系型数据库。
1.关系型数据库
关系型数据库是一个结构化的数据库,创建在关系模型基础上,一般面向记录。它借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织,现实世界中,各种实体与实体之间的各种联系都可以用关系模型来表示。SQL(结构化查询语言)语句就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
主流的关系型数据库包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。
2.非关系型数据库
NoSQL:意思是“不仅仅是SQL”,是非关系型数据库的总称。主流的NoSQL数据库有Redis、MongDB、Hbase、CouhDB等。这些数据库,他们的存储方式,存储结构以及使用场景都是完全不同的。所以我们认为它是一个非关系型数据库的集合,而不是像关系型数据库一样,是一个统称。简单来说:主流的关系型数据库之外的数据库,都可以成为非关系型数据库。NoSQL数据库凭借着其非关系型、分布式、开源和横向扩展等优势,被认为是下一代数据库产品。
3.非关系型数据库产生背景:
关系型数据库已经诞生很久了,而且我们一直都在使用,没有发生有什么问题,面对这样的情况,为什么还能产生非关系型数据库?
随着Web 2.0网站的兴起,关系型数据库在应对Web 2.0网站,特别是海量数据和高并发的SNS(社交网络服务)类型的Web 2.0网站时,暴露出很多难以解决的问题。主要的就是三高问题:
1)对数据库高并发读写需求
Web 2.0网站会根据用户的个性化信息来实时生成动态页面和提供动态信息。因此,无法使用动态页面静态化技术,所以数据库的并发负载非常高,一般会达到10000次/s以上的读写请求。关系型数据库对于上万次的查询请求还是可以勉强支撑的。当出现上万次的写数据请求时,硬盘I/O就已经无法承受了。对于普通的BBS网站,往往也会存在高并发的写数据请求。比如:爆料明星等,就会有很多人评论。结果很有可能因为流量过大而引起网站瘫痪。
2)对海量数据高效存储于访问需求
类似于大型的社交网站,比如:Facebook、Friendfeed等。每天都会产生大型的用户动态信息。例如:Facebook一个月就会产生2.5亿条用户动态信息。对于关系型数据库来说,在一个包含2.5亿条记录的表中执行SQL查询。效率是非常低的。
3)对数据库高可扩展性与高可用需求
在Web架构中,数据库是最难进行横向扩展的。当应用系统的用户量与访问量与日俱增时,数据库是没办法像Web服务器一样,简单得通过添加硬件和服务器节点来扩展其性能和负载能力的。尤其对于一些需要24小时对外提供服务器的网站来说,数据库的升级与扩展往往会伴随着停机维护与数据迁移,其工作量是非常庞大的。
关系型数据库和非关系型数据库都有各自的特点与应用场景。两者的紧密结合将会给Web 2.0的数据库发展带来新的思路。让关系型数据库关注在关系上,非关系型数据库关注在存储上。
通过以上内容,大致可以了解到非关系的一些基本概念,接下来进一步的了解――Redis数据库。
二、Redis数据库基础
1.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个数据的操作、排行榜应用、计数器应用、存储关系、实施分析系统、日志记录等。
2.Redis数据库部署
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
3.配置参数
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服务命令工具的作用:
- redis-server:用于启动Redis服务的工具;
- redis-benchmark:用于检测Redis在本机的运行效率;
- redis-check-aof:修复AOF持久化文件;
- redis-check-rdb:修复RDB持久化文件;
- redis-cli:Redis命令工具;
这篇博文主要介绍redis-cli、redis-benchmark命令工具的使用。
1.redis-cli命令行工具
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
2. redis-benchmark 测试工具
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.1、端口号为6379的Redis服务器发送100个并发连接与10000个请求测试性能 [root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -q -d 100 //针对IP地址为192.168.1.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.1、端口号为6379的Redis服务器在进行set与lpush操作时的性能 //实验环境,性能较差,多多谅解!
四、Redis数据库常用命令
通过博文前面的介绍,已经知道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"
1.key相关命令
1)keys
使用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"
2)exists
使用exists命令可以判断键值是否存在,例如:
127.0.0.1:6379> exists k1 (integer) 1 127.0.0.1:6379> exists k0 (integer) 0 //返回值1表示存在;0表示不存在
3)del
使用del命令可以删除当前数据库的指定key,例如:
127.0.0.1:6379> del k1 (integer) 1 127.0.0.1:6379> get k1 (nil) //删除之后,k1键对应的数据也就消失了
4)type
使用type命令可以获取key对应的value值类型,例如:
127.0.0.1:6379> type k2 string //字符串类型
5)rename
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"
6)renamenx
renamenx命令语法格式、作用与rename命令相同,不同点在于使用renamex命令进行重命名是,如果目标key存在则不进行重命名。例如:
127.0.0.1:6379> keys k?? 1) "k11" 127.0.0.1:6379> renamenx k3 k11 (integer) 0 //返回值是0,表示失败
7)dbsize
dbsize命令的作用是查看当前数据库中key的数目,例如:
127.0.0.1:6379> dbsize (integer) 5
2.多数据库常用命令
1)多数据库间切换
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号数据库
2)多数据库之间移动数据
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号数据库
3)清除数据库内数据
Redis数据库的整库数据删除主要分为两个部分:
- 清空当前数据库的数据,使用“flushdb”命令可以实现;
- 清空所有数据库的数据,使用“flushall”命令可以实现。
但是,数据清空操作比较危险,生产环境下,一般不建议使用。
―――――――― 本文至此结束,感谢阅读 ――――――――
来源:51CTO
作者:筱振
链接:https://blog.51cto.com/14157628/2439872