本文共 9608 字,大约阅读时间需要 32 分钟。
数据库按照其结构可以分为关系型数据库与其他数据库,而这些其他数据库我们统称为非关系型数据库。
1.关系型数据库
关系型数据库是一个结构化的数据库,创建在关系模型基础上,一般面向记录。它借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织,现实世界中,各种实体与实体之间的各种联系都可以用关系模型来表示。SQL(结构化查询语言)语句就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
主流的关系型数据库包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。
2.非关系数据库
NoSQL,意思是“不仅仅是SQL”,是非关系型数据库的总称。主流的NoSQL数据库有Redis、MongDB、Hbase、CouhDB等。这些数据库,他们的存储方式,存储结构以及使用场景都是完全不同的。所以我们认为它是一个非关系型数据库的集合,而不是像关系型数据库一样,是一个统称。换言之,主流的关系型数据库之外的数据库,都可以成为非关系型数据库。NoSQL数据库凭借着其非关系型、分布式、开源和横向扩展等优势,被认为是下一代数据库产品。
主流的NoSQL数据库有Redis、MongDB、Hbase、CouhDB等
3.非关系型数据库产生背景
随着Web 2.0网站的兴起,关系型数据库在应对Web 2.0网站,特别是海量数据和高并发的SNS(社交网络服务)类型的Web 2.0网站时,暴露出很多难以解决的问题。主要有一下三大问题。
1)对数据库高并发读写需求
Web 2.0网站会根据用户的个性化信息来实时生成动态页面和提供动态信息。因此,无法使用动态页面静态化技术,所以数据库的并发负载非常高,一般会达到10000次/s以上的读写请求。关系型数据库对于上万次的查询请求还是可以勉强支撑的。当出现上万次的写数据请求时,硬盘I/O就已经无法承受了。对于普通的BBS网站,往往也会存在高并发的写数据请求,如明星在微博上公布恋情,结果因为流量过大而引发微博瘫痪。
2)对海量数据高效存储于访问需求
类似Facebook、Friendfeed这样的sns网站。每天都会产生大型的用户动态信息。例如:Facebook一个月就会产生2.5亿条用户动态信息。对于关系型数据库来说,在一个包含2.5亿条记录的表中执行SQL查询。效率是非常低的。
3)对数据库高可扩展性与高可用需求
在Web架构中,数据库是最难进行横向扩展的。当应用系统的用户量与访问量与日俱增时,数据库是没办法像Web服务器一样,简单得通过添加硬件和服务器节点来扩展其性能和负载能力的。尤其对于一些需要24小时对外提供服务器的网站来说,数据库的升级与扩展往往会伴随着停机维护与数据迁移,其工作量是非常庞大的。
关系型数据库和非关系型数据库都有各自的特点与应用场景。两者的紧密结合将会给Web 2.0的数据库发展带来新的思路。让关系型数据库关注在关系上,非关系型数据库关注在存储上。1.Redis简介
Redis是一个开源的、使用C语言编写、支持网络、可基于内存亦可持久化的日志型、key-value(键值对)数据库,是目前分布式架构中不可或缺的一环。
Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,而Redis的实际处理速度则完全依靠于主进程的的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力会有一定程度的下降,若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。也就是说,在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPU资源比较紧张,采用单进程即可。
2.redis具有以下显著的优点:
网盘下载:
官方下载:
1.编译安装
[root@localhost ~]# tar zxf redis-3.2.9.tar.gz -C /usr/src/[root@localhost ~]# cd /usr/src/[root@localhost src]# cd redis-3.2.9/[root@localhost redis-3.2.9]# make && make install
再安装过程中,想要更改默认路径,可以使用下列格式实现
make && make PREFIX=安装路径install
make install 只是安装了二进制文件到系统中,并没有启动脚本和配置文件。软件包中默认提供了一个install_server.sh脚本文件。通过该脚本文件可以设置Redis服务所需要的相关配置文件。当脚本执行完毕,Redis服务就已经启动,默认侦听端口为6379
[root@localhost redis-3.2.9]# cd utils/[root@localhost utils]# ./install_server.sh Welcome to the redis service installerThis script will help you easily set up a running redis serverPlease select the redis port for this instance: [6379] Selecting default: 6379Please select the redis config file name [/etc/redis/6379.conf] Selected default - /etc/redis/6379.confPlease select the redis log file name [/var/log/redis_6379.log] Selected default - /var/log/redis_6379.logPlease select the data directory for this instance [/var/lib/redis/6379] Selected default - /var/lib/redis/6379Please select the redis executable path [/usr/local/bin/redis-server] Selected config:Port : 6379Config 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_6379Installing service...Successfully added to chkconfig!Successfully added to runlevels 345!Starting Redis server...Installation successful![root@localhost utils]# [root@localhost utils]# netstat -anput | grep redistcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 7012/redis-server 1
2.Redis控制
[root@localhost ~]# /etc/init.d/redis_6379 stop //关闭[root@localhost ~]# /etc/init.d/redis_6379 restart //重启[root@localhost ~]# /etc/init.d/redis_6379 status //查看状态Redis is running (6396)
3.配置参数
Redis主配置文件为/etc/redis/6379.conf
[root@localhost ~]# vim /etc/redis/6379.conf bind 127.0.0.1 //监听的主机地址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 //重启
除了以上配置参数还有下列
Redis软件提供了多个命令工具,当Redis安装时,所包含的软件工具会同时被安装到系统中,在系统中可以直接使用。
Redis服务命令工具的作用
1.redis-cli命令行工具
Redis数据库系统也是一个典型的C/S(客户端/服务器端)架构的应用,要访问Redis数据库需要使用专门的客户端软件。Redis服务的客户端软件就是自带的redis-cli命令行非法操作。使用redis-cli连接到指定数据库,连接成功后会进入提示符为“远程主机IP地址:端口号>”的数据库操作环境。用户就可以输入各种操作语句对数据库进行管理
[root@localhost ~]# redis-cli 127.0.0.1:6379> pingPONG
远程连接其它主机
-h”指定远程主机“-p”指定Redis服务的端口号、“-a”指定redis数据库的密码
[root@localhost ~]# redis-cli -h 192.168.1.1 -p 6379192.168.1.1:6379> info // info可以查看Redis服务器的详细信息
2.查看命令
在数据库操作环境中,使用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 BRPOPLPUSH source destination timeout summary: Pop a value from a list, push it to another list and return it; or block until one is available since: 2.2.0 LINDEX key index summary: Get an element from a list by its index since: 1.0.0 LINSERT key BEFORE|AFTER pivot value summary: Insert an element before or after another element in a list since: 2.2.0 LLEN key summary: Get the length of a list since: 1.0.0 LPOP key summary: Remove and get the first element in a list since: 1.0.0 LPUSH key value [value ...] summary: Prepend one or multiple values to a list since: 1.0.0 LPUSHX key value summary: Prepend a value to a list, only if the list exists since: 2.2.0 LRANGE key start stop summary: Get a range of elements from a list since: 1.0.0 LREM key count value summary: Remove elements from a list since: 1.0.0 LSET key index value summary: Set the value of an element in a list by its index since: 1.0.0 LTRIM key start stop summary: Trim a list to the specified range since: 1.0.0 RPOP key summary: Remove and get the last element in a list since: 1.0.0 RPOPLPUSH source destination summary: Remove the last element in a list, prepend it to another list and return it since: 1.2.0 RPUSH key value [value ...] summary: Append one or multiple values to a list since: 1.0.0 RPUSHX key value summary: Append a value to a list, only if the list exists since: 2.2.0127.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
3.redis-benchmark 测试工具
[root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -c 100 -n 10000 //针对IP地址为192.168.1.1、端口号为6379的Redis服务器发送100个并发连接与10000个请求测试性能====== MSET (10 keys) ====== 10000 requests completed in 0.26 seconds 100 parallel clients 3 bytes payload keep alive: 1 16.44% <= 1 milliseconds95.07% <= 2 milliseconds96.67% <= 3 milliseconds97.93% <= 4 milliseconds99.24% <= 5 milliseconds99.44% <= 6 milliseconds99.67% <= 7 milliseconds99.92% <= 8 milliseconds100.00% <= 9 milliseconds38759.69 requests per second[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 -qSET: 37313.43 requests per secondLPUSH: 45248.87 requests per second//针对IP地址为192.168.1.1、端口号为6379的Redis服务器在进行set与lpush操作时的性能
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) 1127.0.0.1:6379> exists k0(integer) 0//返回值1表示存在;0表示不存在
3)del
使用del命令可以删除当前数据库的指定key。
127.0.0.1:6379> del k1(integer) 1127.0.0.1:6379> get k1(nil)
4)type
使用type命令可以获取key对应的value值类型。
127.0.0.1:6379> type k2string//字符串类型
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 k3OK127.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
1)多数据库间切换
Redis支持多数据库,默认有16个数据库,数据库名称是用数字0-15来表示的。
27.0.0.1:6379> SELECT 10 //切换至序号为10的数据库OK127.0.0.1:6379[10]> SELECT 15OK127.0.0.1:6379[15]> SELECT 0OK
2)多数据库之间移动数据
Redis的多数据库在一定程度上是相对独立的,在1创建的数据,在10上是没有的
127.0.0.1:6379> set q1 1OK127.0.0.1:6379> select 1OK127.0.0.1:6379[1]> get q1(nil)
Redis数据库提供了一个“move”命令,可以进行多数据库的数据移动
127.0.0.1:6379> move qzt1 1(integer) 1127.0.0.1:6379> select 1OK127.0.0.1:6379[1]> get qzt1"1"
3)清除数据库内数据
清空当前数据库数据:flushdb
清空所有数据库数据:flushall(谨慎使用)
转载地址:http://xgizk.baihongyu.com/